C# 如果使用随机盐与sha512进行哈希运算,则比较密码?

C# 如果使用随机盐与sha512进行哈希运算,则比较密码?,c#,hash,cryptography,sha,password-hash,C#,Hash,Cryptography,Sha,Password Hash,我认为关于如何在数据库中存储密码的建议存在矛盾。 我们散列密码并将其存储在数据库中,当用户尝试登录时,我们以相同的方式散列其输入字符串并与数据库进行比较。那很好。 但也有建议通过添加随机盐来加强这种散列。 问题是: 所以我们失去了整个比较点,因为存储在DB中的第一个散列和登录时的salt之间的salt值将不同?? 如果将盐储存在Db中,那么盐渍的好处是什么呢?你也储存盐。比较存储的哈希值和HASHsalt+输入。salt的目的是防止两个使用相同密码的用户生成相同的散列。我们为每个密码生成随机sa

我认为关于如何在数据库中存储密码的建议存在矛盾。 我们散列密码并将其存储在数据库中,当用户尝试登录时,我们以相同的方式散列其输入字符串并与数据库进行比较。那很好。 但也有建议通过添加随机盐来加强这种散列。 问题是: 所以我们失去了整个比较点,因为存储在DB中的第一个散列和登录时的salt之间的salt值将不同??
如果将盐储存在Db中,那么盐渍的好处是什么呢?

你也储存盐。比较存储的哈希值和HASHsalt+输入。salt的目的是防止两个使用相同密码的用户生成相同的散列。

我们为每个密码生成随机salt的原因是,不能构建一个彩虹表来同时获取所有密码。相反,攻击者必须为每个salt/密码构建一个彩虹表。构建一个彩虹表来获取单个密码是毫无意义的,因为如果找到匹配的密码,您可以停止搜索

换句话说,盐渍可以防止彩虹桌的使用。即使salt是已知的,也可以实现这个目的,我们仍然需要为每个密码构建一个彩虹表,这就是为什么我们可以将salt和hash一起存储在数据库中

顺便说一句:SHA-*散列函数不适合散列密码,相反,应该使用像BCrypt、SCrypt、PBKDF2或Argon2这样的密码散列函数。它们都有一个使散列速度变慢的成本因素

编辑

以下示例仅用于更好地理解,不应以这种方式添加盐:

1. Example with the same (global) salt for all passwords:

hash("Password1"+"o9*eiwrC49YAS2395%tu") => hash1
hash("Password2"+"o9*eiwrC49YAS2395%tu") => hash2
hash("Password3"+"o9*eiwrC49YAS2395%tu") => hash3
为了找出密码1,我们可以建立一个包含所有合理密码和全局salt的查找表。为了找出密码2,我们可以重复使用相同的查找表,因为所有密码都使用相同的全局salt

2. Example with unique salts for each password:

hash("Password4"+"ierukElasidj42Swiekq") => hash4
hash("Password5"+"oeuoElwWPJckfk212344") => hash5
hash("Password6"+"PoiMnmdvhas98akd73lk") => hash6

为了找出密码4,我们必须构建一个包含所有合理密码和salt ierukElasidj42Swiekq的查找表。要找到密码5,必须使用salt oeuoElwWPJckfk212344构建另一个查找表,以此类推。第一个示例需要1个查找表,第二个示例需要与密码一样多的查找表。

这并不是说salt不安全,因为我们谈论的是一个黑客,他将从数据库中获取密码,因此除了salt之外,破解密码也很容易。我错过了什么?不,不是没有安全感。salt被视为公共信息,其唯一目的是使每个散列唯一,并防止基于彩虹表等预计算值的暴力攻击。另请参见OWASP。John Stevens在创建威胁模型和设置安全控制以遏制威胁方面做得非常好。它包括添加密码的原因。如果要在Db中存储密码,那么添加密码有什么好处Salting确保两个碰巧选择相同密码的用户不会在数据库中发生冲突。如果没有它,用户可以使用自己的密码来探测其他用户的密码,前提是他/她有办法转储用户表。一旦被击中,他/她可能会伪装成另一个用户,因为他学会了密码。@jww-对相同的密码使用不同的哈希值只是salting的一个小好处,实际原因是为了防止rainbowtable攻击。@martinstoeckli-对整个表使用一个salt可以防止预计算。请参阅威胁模型中的攻击1.2,详情见。@jww-这是真的,与碰撞无关。预计算意味着您在知道全局salt之前无法计算rainbowtable,但您可以构建1个rainbowtable来获取所有密码。独特的盐完全否定了彩虹桌的优势。我写了一个关于“也许你感兴趣”的小教程。对不起,但我不明白为什么如果salt已知,那么为所有密码建立一个查找表是不够的,它只是用每个猜测的密码再次散列已知salt,例如salt+'hello'=qtgyw0002 salt+'martin123'=j3j2ki2900@DanielMoreshet-我添加了一个示例,以更清楚地区分全球盐和独特盐。