我正在从头开始构建一个项目,并且我想以正确的方式做事™。我在网上读过有关哈希的内容,这基本上就是将密码转换为 64 个字母的繁文缛节,对吗?
腌制怎么样?
我的问题是:
- 如何使用 C# 对字符串进行哈希处理?
- MSSQL 中的字段声明类型是什么? nvarchar(64)?
- 什么是加盐?我需要将其保存在数据库中的某个位置吗?
- 如果我打算让人们使用 Facebook Connect,我是否需要担心创建哈希/盐?
代码示例是首选。谢谢!
我将跳过问题 1,因为我不是 C# 人员。
问题3:
加盐是在散列之前向密码添加一串随机数据。盐是必不可少的,因为如果没有它们,攻击者就有可能预先生成一个彩虹桌 http://en.wikipedia.org/wiki/Rainbow_table已知密码哈希值。加盐意味着不能预先构建彩虹表,并且意味着必须单独暴力破解每个密码。
为每个密码生成一个新的盐非常重要。
盐值不是秘密的,可以与散列密码一起存储在数据库中。
生成和检查密码的伪代码如下:
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));
}
问题2:
数据库字段的长度取决于哈希算法。 SHA1 生成 160 位输出,因此如果进行十六进制编码,则为 40 个字符。一个好的经验法则是使用与散列输出大小相同的盐,因此您将有两个 40 字符的列:一列用于盐,一列用于散列。
问题4:
抱歉,不知道 Facebook Connect 是如何工作的。我希望其他两个答案有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)