什么是加密密码的最佳方式?

5

我即将为我的应用程序制作“登录”,想知道将用户密码加密后存储到数据库中的最佳方法是什么?在Google上找到了很多方法,但不知道哪种方法是最好的。


你需要“加密”密码还是“哈希”密码?这不一样。哈希更安全,但如果你将来需要能够读取它们,那么加密是更好的选择。下面大多数答案都假设你想要哈希。你能澄清一下吗 :) ? - Simon Mourier
我想要哈希。更安全 :) - Alex
5个回答

8

我建议使用单向哈希加盐

例如,使用SHA1哈希函数,你可以将密码存储为无法反转回原始密码的哈希值。当用户输入密码时,对其进行相同的SHA1哈希处理,然后将该哈希与存储在数据库中的哈希进行比较,如果匹配,则密码正确。

为了进一步保证哈希的安全性,可以加入“盐”,这实际上是一个为每个用户生成的随机值,然后在创建帐户时将盐值存储在用户记录中。当你创建密码的哈希值时,你首先将密码与盐结合起来,然后对这个组合值进行哈希处理。要验证用户,你需要将输入的密码与存储在用户账号中的盐混合,对组合值进行哈希处理并进行比较。

通过添加盐到哈希中,你可以确保具有相同密码的哈希具有不同的哈希值,因为盐部分不同。因此,即使两个用户具有相同的密码“Password1234”,也不会有相同的存储哈希值,因此不能确定两个用户具有相同的密码。


+1,但我不建议使用SHA1。我建议使用blowfish/twofish或SHA-2。请参见:https://dev59.com/S3I_5IYBdhLWcg3wBuRs - Falcon
使用SHA1/SHA2算法并不是最优的选择,因为它们速度较快,更容易遭受暴力破解攻击。因此,使用一个好的KDF算法会更好。 - CodesInChaos
1
这是一个很好的开始之处:http://www.obviex.com/samples/EncryptionWithSalt.aspx。 - Tom
盐值哈希算法虽然很好,但无法防止暴力攻击 - SHA 算法速度更快。现在,你可以租用使用 GPGPU 构建的密码破解集群,这些集群在暴力破解方面非常 - snemarch

3
我建议使用Rfc2898DeriveBytes。 它使用良好的标准化密钥派生函数和现代哈希算法。您需要传递一个盐值以及密码以防止彩虹表攻击。它会自动为您混合盐和密码,因此您无需自行确定如何完成该操作。

1
RFC2898也被称为PBKDF2。 - caf

1

使用bcrypt。不要自己构建密码哈希方法的想法,使用bcrypt。世界上已经有足够多的自制不安全的密码哈希方案了。

存储加盐的密码哈希值,当然每个用户都有自己的盐,这是非常好的。但是仅仅加盐只能防止彩虹表攻击,无法防止暴力破解。所以,矛盾的是,您不希望使用快速的方法来生成或验证密码哈希值。MD5、SHA等都很快。请跟我重复:使用bcrypt。


Bcrypt和PBKDF2(又名RFC2898)都是很好的KDFs。但请务必使用真正的KDF! - caf


-1

使用 .net 框架提供的加密算法

通常,许多应用程序使用 MD5 算法

在这里查看


3
除非你绝对需要更小的密钥大小或更快的速度,否则在新应用程序中使用MD5其实没有任何理由。 - Cody Gray
除了向后兼容性之外,没有使用MD5的理由。对于新代码,我更喜欢SHA-1或SHA-2。 - CodesInChaos
绝对是SHA-2。.NET Framework在System.Security.Cryptography命名空间中提供了SHA256和SHA512作为内置函数。 - Cody Gray
请同时将回答下投票,以便我学到有用的东西。 - TalentTuner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接