2

我正在尝试为我的网站制作一个或多或少安全的登录系统,我没有太多时间来保护东西,所以我边走边学。想听听一些关于以下哪个更好以及为什么的观点。(或者我在某个地方犯了错误?)

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

3 回答 3

3
  1. SHA512 是一种相当快的算法,它通常是密码散列算法的不良属性。
  2. 使用可预测的值(例如microtime盐的随机种子)可能会使您面临一些更随机的值可以防止的高级攻击。

我推荐 phpass,它是密码散列系统的一个很好的现有实现。
http://www.openwall.com/phpass/

于 2011-08-14T10:41:58.677 回答
0

不要像那样捣碎你的盐。

crypt的 Blowfish 散列采用 22 个字符的 base64 编码字符串(使用字符 [./0-9A-Za-z])作为盐,这相当于 128 位熵。

您用于创建盐的 SHA-512 哈希具有 512 位熵。但是您丢弃了超过 80% 的内容,因为crypt现在将只使用 22 个小写十六进制字符。尽管你正在做所有花哨的随机生成,这让你只剩下大约 85 位的熵。

如果 85 位对您来说足够好,您不妨这样做:

$salt = str_replace("+", ".", base64_encode(md5(uniqid(mt_rand(), true), true)));

我真的不敢就如何生成使用完整 128 位的盐给你任何建议,因为我不是密码学专家。

于 2011-08-14T14:16:38.480 回答
-2

实际上没有必要宣传如此多的安全性。你必须知道你的系统是用来做什么的。如果它只是一些聊天,那么你会很好地使用 md5。如果它的银行系统,那么你必须有一些真正的身份验证系统,我的意思是一些带有盐或代码生成器的卡。

编辑:我不认为有一个好的安全策略。上面的答案很棒,我想。

于 2011-08-14T10:48:40.847 回答