我正在尝试为我的网站制作一个或多或少安全的登录系统,我没有太多时间来确保安全,所以我一直在学习。希望听到一些关于以下哪个更好以及为什么更好的观点。 (或者我在某处犯了错误?)
$staticsalt = '$%*#)$*)^A#$#543667ggfdf\#$%x';
$random = md5(uniqid(mt_rand(), true));
$salt = hash('sha512',$random.$_POST['password'].microtime().$staticsalt);
(无需在数据库中使用$ salt)
$password = crypt($_POST['password'], '$2a$12$'.$salt);
或(我需要数据库中的$ salt ...)
$password = hash('sha512',$salt.$_POST['password']);
答案 0 :(得分:3)
microtime
)作为salt 的随机种子可能会打开一些高级攻击,而这些攻击会更随机地阻止。我推荐phpass,这是一个很好的密码散列系统的现有实现 http://www.openwall.com/phpass/
答案 1 :(得分:0)
不要像那样哈希你的盐。
crypt
的Blowfish哈希采用22个字符的base64编码字符串(使用字符[./0-9A-Za-z])获取盐,这相当于128位熵。
用于创建salt的SHA-512哈希具有512位熵。但是,由于crypt
现在只使用22个小写的十六进制字符,因此您丢失了80%以上。尽管你正在做的所有奇特的随机性产生,但只留下大约85位的熵。
如果85位对你来说足够好,你也可以这样做:
$salt = str_replace("+", ".", base64_encode(md5(uniqid(mt_rand(), true), true)));
我真的不敢就如何生成使用全部128位的盐给出任何建议,因为我不是加密专家。
答案 2 :(得分:-2)
Actualy没有必要提供如此多的安全性。你必须知道你的系统是为什么做的。如果它只是一些聊天,那么你可以使用md5。如果它的银行系统,那么你必须有一些真正的认证系统,我的意思是一些带盐或代码生成器的卡。
编辑:我不认为有一个好的安全政策。思想上层答案很好。