2012-10-31 47 views
1

我是新來的perl,我想要做的是確保每個用戶至少每7天不斷修改自己的密碼。如果他沒有,系統會引起他更改密碼或將他註銷。但在我的情況下,說包含所有用戶ID和密碼的文件在文件userid_passwd.txt。因此,如果單個用戶修改或更改其密碼,則userid_passwd.txt的文件戳將會更改。因此,即使一個用戶在一週內遵守一次修改密碼的規範,而其他人也可以登錄。如何確保在perl腳本中每7天更改一次用戶的密碼

open WORDSLIST, $filename 
    or die "can't open wordlist: $!"; 

if (-M WORDSLIST < 7.0) { 

    while ($name = <WORDSLIST>) { 
     \\Do Something 
    } 
} 
close WORDSLIST 
    or die "couldn't close wordlist: $!"; 

但是代碼部分if (-M WORDSLIST < 7.0) {不是我想要爲我的文件的東西包含在其中後者指派到一個散列變量以便爲每個用戶的用戶ID和密碼。

+4

是否要這個「真正的」,或者如果它只是一個學習鍛鍊做現在還不清楚,但是,如果你想讓它成爲一個真正的密碼策略,那麼請... _don't做這個_。密碼更改策略,尤其是需要頻繁更改的策略,增加成功攻擊系統的可能性,因爲用戶將使用易於記憶的密碼,通常是順序的(mypass1,mypass2,mypass3 ...),這使得攻擊者更容易猜測。 –

+0

更不用說,任何進入你的系統的人都會遇到這個我認爲是純文本的存儲用戶名/密碼組合的寶庫。 – AWT

回答

3

我假設你的文件目前同時擁有usernamepassword,你還可以添加一個last_changed作爲日期時間,並根據它做你的邏輯。

+1

是啊我想這樣我可以防止爲個人用戶製作個人文件。我想我可以試試:) – Invictus

+2

無論如何,它看起來像你的應用程序正在發展 - 也許這是切換到使用數據庫的好時機。 –

3

當用戶上次更改密碼時,您需要跟蹤的某處。或者,保留7份年齡爲1至7天的密碼文件,並查看用戶密碼是否與原來一樣。

+0

感謝您的建議,我總是可以做到這一點..但我想知道是否有一種方法,我可以取消只有一個文件包含有關所有用戶和他們的密碼的信息。 – Invictus

2

如果你想建立一個更加靈活和成年的解決方案,你可以同時使用一個簡單的SQLite數據庫ORLite來存儲密碼(salted hashes!)和最後修改的時戳像這樣(不完全的,只是爲了讓你開始):

#!/usr/bin/env perl 
use strict; 
use warnings; 
use feature 'say'; 
use FindBin '$Bin'; 
use Crypt::SaltedHash; 
use ORLite { 
    file => "$Bin/login.db", 
    create => sub { shift->do(' 
     CREATE TABLE login (
      user   TEXT NOT NULL PRIMARY KEY, 
      salted_hash  TEXT NOT NULL, 
      last_modified INTEGER NOT NULL 
     ) 
    ')}, 
}; 

# ... 

my $login = Login->load($name); 
say 'password ok' if $crypter->validate($login->salted_hash, $password); 
say 'password change ok' if time - $login->last_modified < 60 * 60 * 24 * 7;