mysql - 在 MySQL 数据库 : Hash vs Encryption? 上存储密码

标签 mysql database encryption hash password-protection

我一直在阅读在 MySQL 数据库上存储敏感数据时使用散列与加密的优缺点,双方支持散列或加密的人的争论只让我感到困惑和不确定一个使用。

哈希:

"INSERT INTO users (`id`,`username`,`password`) VALUES("Bob",SHA2("password1234"));"

缺点:

  • 已弃用

  • 彩虹表

加密:

"INSERT INTO users (`id`, `username`, `password`) VALUES ("Bob", aes_encrypt("password1234", "key1234"))";

缺点:

  • 可能不适用于某些归类类型

  • key 可能被泄露

  • 彩虹表

那么,就提供安全性和性能(从数据库快速读取和检索)而言,哪个更理想? (在大约 1,000 - 5,000 行的表中)。

最佳答案

我先不说了。您永远不要存储密码,即使是加密的。这使您容易受到组织外部或内部的密码窃取。此外,SHA2 本身并没有被弃用,并且您没有指定哈希长度。 SHA2-512 甚至 SHA2-256 仍然被认为是优秀的加密哈希。您也可以使用更新的 SHA3/Keccak 密码哈希,但从最近的文献来看,它并不比 SHA2 好多少,而是有很大的不同。两者仍然得到 NIST 的认可。

但是,InfoSec 一致认为简单的加密散列不足以正确存储 secret 。截至 2018 年,似乎 PBKDF2、bcrypt 或 ARGON2 被广泛认为是“最佳”加密哈希算法的顶级竞争者。您可以在此 Security StackExchange 链接上阅读有关密码和加密哈希的更详细的解释 https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846

上面的链接没有解释 ARGON2,它是最近密码哈希竞赛的获胜者。您可以在这里阅读更多相关信息:https://github.com/p-h-c/phc-winner-argon2

我的建议是:

  • 将第四个字段添加到名为salt 的表中。这应该是一个真正随机的 8 位以上的字母数字字符串,以明文形式存储。
  • 将“密码”存储为 CryptoHash(salt + 'password1234')。这可以保护您免受彩虹表的影响,因为预先计算所有可能的盐的所有彩虹表是不可行的。

用 PBKDF2、bcrypt 或 ARGON2 替换上面的 CryptoHash,您将拥有一个非常好的密码存储机制。

关于mysql - 在 MySQL 数据库 : Hash vs Encryption? 上存储密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52772754/

相关文章:

php - SQL/PHP 多重查询

php - 数据规范化还是智能搜索?

MySQL预订网站: query/db optimization

javascript - Node.js Base64 字符串的 AES 解密

mysql - BASH 脚本 - 通过 ssh 连接并运行 mysql 命令

php - 如果无法正常工作,则在其中分页

android - 如何在android中连接服务器数据库而不会丢失/失败?

c++ - c++ 和 node.js 之间的 RSA 加密

php - 登录后,所有页面都应该是https吗?

Mysql查询优化与排序