Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL数据库上存储密码:散列还是加密?_Mysql_Database_Encryption_Hash_Password Protection - Fatal编程技术网

在MySQL数据库上存储密码:散列还是加密?

在MySQL数据库上存储密码:散列还是加密?,mysql,database,encryption,hash,password-protection,Mysql,Database,Encryption,Hash,Password Protection,我一直在阅读在MySQL数据库上存储敏感数据时使用散列还是加密的利弊,而赞成散列还是加密的人的争论只会让我感到困惑和不确定该使用哪一种 散列: 缺点: 不赞成 彩虹桌 加密: "INSERT INTO users (`id`, `username`, `password`) VALUES ("Bob", aes_encrypt("password1234", "key1234"))"; 缺点: 可能不适用于某些排序规则类型 钥匙可能被泄露了 彩虹桌 那么,在提供安全性和性能(从数据库快

我一直在阅读在MySQL数据库上存储敏感数据时使用散列还是加密的利弊,而赞成散列还是加密的人的争论只会让我感到困惑和不确定该使用哪一种

散列:

缺点:

  • 不赞成

  • 彩虹桌

加密:

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

  • 可能不适用于某些排序规则类型

  • 钥匙可能被泄露了

  • 彩虹桌


那么,在提供安全性和性能(从数据库快速读取和检索)方面,哪一个更理想呢?(在一张大约1000-5000行的表格中)。

我要继续说,两行都不说。你不应该存储密码,即使是加密的。这使得您很容易受到组织外部或内部密码窃取的攻击。此外,SHA2本身并没有被弃用,您也没有指定哈希长度。SHA2-512甚至SHA2-256仍然被认为是优秀的加密哈希。您也可以使用较新的SHA3/Keccak crytographic散列,但从最近的文献来看,它与SHA2相比并没有多大不同。这两种方法仍然得到NIST的认可

然而,InfoSec一致认为,一个简单的加密散列不足以正确存储机密。截至2018年,PBKDF2、bcrypt或ARGON2似乎被广泛认为是“最佳”加密哈希算法的最佳竞争者。您可以在此Security StackExchange链接上阅读有关密码和加密哈希的更详细说明

上面的链接没有解释ARGON2,它是最近密码哈希竞赛的冠军。您可以在此处阅读更多信息:

我的建议是:

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

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

我将继续说,它们都不是。你不应该存储密码,即使是加密的。这使得您很容易受到组织外部或内部密码窃取的攻击。此外,SHA2本身并没有被弃用,您也没有指定哈希长度。SHA2-512甚至SHA2-256仍然被认为是优秀的加密哈希。您也可以使用较新的SHA3/Keccak crytographic散列,但从最近的文献来看,它与SHA2相比并没有多大不同。这两种方法仍然得到NIST的认可

然而,InfoSec一致认为,一个简单的加密散列不足以正确存储机密。截至2018年,PBKDF2、bcrypt或ARGON2似乎被广泛认为是“最佳”加密哈希算法的最佳竞争者。您可以在此Security StackExchange链接上阅读有关密码和加密哈希的更详细说明

上面的链接没有解释ARGON2,它是最近密码哈希竞赛的冠军。您可以在此处阅读更多信息:

我的建议是:

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

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

没有混淆、不确定性或问题。散列是唯一的方法。加密是可逆的,你永远不会想要得到明文密码。没有混乱、不确定性或问题。散列是唯一的方法。加密是可逆的,你永远都不想获得明文密码。在我看来,这是一个非常好的选择。理想的密码是随机的(用户自己通常不会随机生成密码),长度为9个字符,并且至少由2-3个数字组成,这就是salt的作用。这确保了9长度(或更多)的密码是随机的。然后需要一个适当的散列,因为argon2赢得了PHC,我们只能假设这是最好的选择。现在,即使你使用4 RTX gfx,运行hashcat,破解这个也需要相当长的时间。然而,如果量子计算机能够向公众开放(到时候可能会开放),这将是一个大问题。大多数密码哈希函数的实现(BCrypt、SCrypt、Argon2)自己创建salt并将其存储在生成的哈希字符串中,因此,数据库中应该不需要额外的字段。@martinstoeckli您建议将Bcrypt哈希按原样存储在数据库中,还是在将其存储在数据库中时应使用SHA-256再次对其进行哈希?@JaeBin-只需将Bcrypt哈希字符串存储在数据库中即可。要验证密码,函数需要从字符串中提取使用的算法、成本因素和salt(有关更多详细信息,请参阅另一个)。这使密码散列函数成为未来的证明,如有必要,它可以更改算法或成本因素,但如果您进行额外的散列,这是不可能的。在我看来,这是一个非常好的选择。理想的密码是随机的(用户自己通常不会随机生成密码)9个字符长,至少由2-3个数字组成,这就是盐的来源。这确保了9长度(或更多)的密码是随机的。然后
"INSERT INTO users (`id`, `username`, `password`) VALUES ("Bob", aes_encrypt("password1234", "key1234"))";