随机盐+散列传递或随机盐+ crypt()传递?

时间:2011-08-14 10:18:43

标签: php security hash salt bcrypt

我正在尝试为我的网站制作一个或多或少安全的登录系统,我没有太多时间来确保安全,所以我一直在学习。希望听到一些关于以下哪个更好以及为什么更好的观点。 (或者我在某处犯了错误?)

$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']);

3 个答案:

答案 0 :(得分:3)

  1. SHA512是一种非常快速的算法,通常是密码散列算法的不良属性。
  2. 使用可预测的值(例如microtime)作为salt 的随机种子可能会打开一些高级攻击,而这些攻击会更随机地阻止。
  3. 我推荐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。如果它的银行系统,那么你必须有一些真正的认证系统,我的意思是一些带盐或代码生成器的卡。

编辑:我不认为有一个好的安全政策。思想上层答案很好。