我正在从头开始构建一个项目,我想以正确的方式做事™。我在网上阅读过有关哈希的内容,这基本上是将密码变成 64 个胡言乱语的字母,对吗?
加盐怎么样?
我的问题是:
- 如何使用 C# 对字符串进行哈希处理?
- MSSQL 中的字段声明类型是什么? nvarchar(64)?
- 什么是加盐,我需要将其保存在数据库中的某个位置吗?
- 如果我打算让人们使用 Facebook Connect,我是否需要担心创建哈希/salt?
代码示例优先。谢谢!
最佳答案
我将跳过问题 1,因为我不是 C# 人员。
问题三:
加盐是在散列之前将一串随机数据添加到密码中。盐是必不可少的,因为没有它们,攻击者就有可能预先生成 rainbow table。已知密码哈希值。加盐意味着彩虹表不能被预先构建,这意味着每个密码必须单独被暴力破解。
为每个密码生成一个新盐很重要。
盐值不是 secret 的,可以与哈希密码一起存储在您的数据库中。
生成和检查密码的伪代码如下:
generatePassword(String user, String password) {
String salt = generateRandomSalt();
String salted = salt + password;
String hash = hexEncode(hash(salted));
store(user, hash, salt);
}
checkPassword(String user, String testPassword) {
String salt = lookupSalt(user);
String salted = salt + testPassword;
String testHash = hexEncode(hash(salted));
return testHash.equals(lookupHash(user));
}
问题二:
数据库字段的长度取决于哈希算法。 SHA1 生成 160 位输出,因此如果采用十六进制编码,则为 40 个字符。一个好的经验法则是使用与哈希输出大小相同的盐,因此您将有两个 40 个字符的列:一个用于盐,一个用于哈希。
问题 4:
抱歉,不知道 Facebook Connect 是如何工作的。我希望其他两个答案对您有所帮助。
关于c# - 我如何在我的 ASP.Net 应用程序上使用 salting+hashing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404253/