crypt crypt PLAINTEXT, SALT
这个函数用和 crypt(3) 完全一样的方法计算一个字串的单向散列。这个功能对于检查口令文件中是否有极烂的口令很有用,(注:只有那些具有诚实的意图的人才可以做这些事情。)尽管你真正想干的事情是防止人们在一开始就使用糟糕的口令。
crypt 是有意做成一个单向函数的,和打破鸡蛋炸煎鸡蛋一个道理。目前没有(已知)的办法解密一个加了密的口,只能用穷举法的强行猜测方法。
当验证一个现有的加密字串的时候,你应该用该加密的文本做 SALT(象 crypt($plain, $crypted) eq $crypted)。这样就令你的代码和标准 crypt 兼容,并且还可以有更多奇特的实现。
当你选择一个新的 SALT 的时候,你最少需要创建一个两字符长的随机字串,它的字符来自集合 [./0-9A-Za-z](类似 join ' ', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64])。更早的 crypt 的实现只需要 SALT 的头两个字符,不过我们现在认为那些只给出头两个字符的代码是不能移植的。参阅你本地的 crypt(3) 手册页获取更多有趣的细节。
下面是一个例子,它可以证实哪个运行此程序的人知道他们自己的口令:
$pwd = (getpwuid ($<))[1]; # 假设我们在 Unix 上。 system "stty -echo"; # 或者看看 CPAN 上的 Term::ReadKey print "Password: "; chomp($word = ); print "\n"; system "stty echo"; if (crypt($word, $pwd) ne $pwd) { die "Sorry...\n"; } else { print "ok\n"; }
当然,向任何问你索要口令的东西键入你的口令都是不明智的举动。
影子口令文件比传统的口令文件稍微更安全些,并且如果你想访问它们的话那么你就必须是超级用户。因为很少的几个程序才能运行在这样强大的权限下,所以你可能需要让程序维护它自己独立的认证系统,方法是把 crypt 字串保存在与 /etc/passwd 和 /etc/shadow 不同的地方。
crypt 函数不适合做大量数据的加密,更重要的是因为你不能取回数据。查看你喜爱的 CPAN 的 by-module/Crypt 和 by-module/PGP 目录寻找一些可能有用的模块。