如何使用 CRYPT_SHA512 增加 crypt PHP API 的盐长度?

How to increase the salt length of crypt PHP API with CRYPT_SHA512?

<?php

  echo 'SHA-512:' . crypt('rasmuslerdorf', '$rounds=5000$usesomesillystringforsalt$');

输出: SHA-512: $rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

它只使用 16 个字符的盐:usesomesillystri

参考: crypt — One-way string hashing

问题:

提前致谢。

两个问题立刻浮现在脑海中:

  1. 你为什么使用 CRYPT_SHA512 而不是 CRYPT_BLOWFISH
  2. 你为什么使用 crypt() 而不是 password_hash()/password_verify()/password_needs_rehash()

你应该使用 password_* 而不是 crypt() 的原因之一是它会为你生成一个独特的随机盐。如果您的目标是安全,您真的不想手动滚动自己的盐生成器。

Is it possible to increase the salt length?

SHA512Crypt 只允许 16 个字符的盐。 Bcrypt 使用 22 个字符的盐(128 位随机字符串的 base64 编码表示)。

让我们量化一下:一个 128 位盐(由 CSPRNG 驱动)将在 2^64(1.8446744e+19,或 18,446,744,073,709,551,616) 生成密码哈希值。

对于地球上每个活着的人来说,这大约是 26 亿个 bcrypt 哈希。

不需要更长的盐来获得任何明显的安全收益。

Is there any drawback if we increase the salt length?

它会静静地截断,虽然你可能觉得使用更长的盐看起来很聪明,但这对安全性没有影响。

延伸阅读:How to safely store your users' passwords in 2016.