1

我是 perl 的新手,我想做的是确保每个用户至少 7 天不断修改他的密码。如果他没有,系统将促使他更改密码或将他注销。但在我的例子中,包含所有用户 ID 和密码的文件都在一个文件中userid_passwd.txt。因此,如果单个用户修改或更改了他的密码,则文件戳userid_passwd.txt将被更改。因此,即使一个用户遵循每周修改一次密码的规范并休息一下,他们也将能够登录。

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

3 回答 3

3

当用户上次更改密码时,您必须在某个地方进行跟踪。或者,保留 7 份密码文件的副本,从 1 到 7 天,并查看用户的密码是否与原来相同。

于 2012-10-31T08:50:53.097 回答
3

我假设您的文件当前同时包含usernamepassword,您还可以添加 alast_changed作为日期时间并基于此执行您的逻辑。

于 2012-10-31T09:38:20.257 回答
2

如果你想构建一个更灵活和成熟的解决方案,你可以使用一个简单的SQLite数据库和ORLite来存储密码(加盐哈希!)和最后修改的时间戳,如下所示(不完整,只是为了让你开始):

#!/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;
于 2012-10-31T10:46:05.003 回答