我正在构建一个应用程序并将用户密码存储在 MySQL 的表中。我已经在使用,bcrypt
但想知道在将密码存储到数据库之前对散列密码进行 AES_ENCRYT() 是否有意义?
Example:
$bcrypt = new Bcrypt();
$hash = $bcrypt->hash('some-password-here');
我应该将 $hash 存储为 varchar(60) 还是调用 MySQLAES_ENCRYPT('crypto_key', $hash)
并存储在一blob
列中?
答案1
不,具有合理工作因子的 bcrypt 散列密码本身应该足够安全。
答案2
不得不不同意前面的答案:它确实有道理,但并不完全。
此处的 AES 加密将为密码安全增加一层保护,该层保护基于未存储在数据库中的信息(我假设您不会将 AES 密钥与密码放在同一个数据库中)。在几种情况下,密码数据库可能会在无法访问应用程序配置的情况下遭到破坏。(SQL 注入、不同服务器上的数据库、访问数据库备份等)
即使使用 bcrypt 的用户特定盐,弱密码仍然相对容易被破解。任何密码数据库中都会有大量弱密码。
不合理的一点是:为什么要使用对称加密,在运行 BCrypt 之前只需将密钥附加到密码中即可?因此,通过以下方式可以获得相同的安全级别:
$hash = $bcrypt->hash('some-password-here' . 'crypto_key');
阅读更多:http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/