我一直在阅读在 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/