2012-11-25 29 views
4

我刚刚开始学习PHP,并且想创建一个网站,其中包含我的最后一年大学项目的登录信息。我读过,河豚是对于一些喜欢这里的地方散列的最好方法:openssl_digest vs hash vs hash_hmac? Difference between SALT & HMAC?如何使用blowfish自动生成加密方法的盐

无论我读到地穴方法包括像$2y$07$usesomesillystringforsalt$一串我的主要问题是:我怎么随机产生的?我读过时间戳和mt_rand()不安全的地方。

另外我也听说过AES是最近的首选技术,但从我可以看到它在PHP中实现似乎相当棘手!河豚仍然是确保存储密码的可接受方法吗?

+2

它不会随机产生它的'$ algo $ cost $ salt $',其中salt是完全安全的,可以使用与您的域名sha1'nd'substr(salt,0,21)贴在一起的microtime,然后21个字符被丢弃。也许我早期提出的一些内容会让你感兴趣[php-pdo-secure-login-script-example](https://code.google.com/p/php-pdo-secure-login-script-example/source/browse/分支/ index.php) –

回答

6

盐应该是唯一(对于每个密码)和不可预知。这两个标准有点难以用确定性计算机实现,所以最好的办法是使用操作系统的随机源生成盐。

时间戳以及mt_rand()函数并不理想,因为可以说它们是可预测的。至少一个攻击者可以缩小(并因此预先计算)一段时间内可能的组合。虽然这在实践中可能没有很大的影响,但为什么不尽力做到最好?

从PHP 5.3开始,您可以安全地使用mcrypt_create_iv()函数从随机源中读取数据,然后您必须将二进制字符串编码为允许的字母表。这是一个possible implementation

PHP 5.5将自己的功能password_hash()password_verify()准备就绪,以简化这项任务。还有一个用于PHP 5.3/5.4的compatibility pack,可在password_compat下载。

3

河豚仍然可以接受,并且优于快速哈希方法。

盐的一点是为了防止预先计算的表攻击。只要你有一个非平凡的盐,就像microtime一样,你已经阻止了任何预先计算好的没有使用精确盐的表。

+0

所以''密码= crypt($ _ POST [passward],'$ 2y $ 07 $'。microtime());'行吗?感谢您的帮助 – Connel

+0

@Connel如果语法正确,是的。 –

3

对于PHP版本5.3.7或更高版本我相信这是最好的:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22)); 

对于PHP版本5.5或只使用新的password_hash()function自动生成盐更高。

+0

当心伙计,bin2hex(openssl_random_pseudo_bytes(22))将返回44个字符。 对于php河豚,你需要bin2hex(openssl_random_pseudo_bytes(11)) –