【发布时间】:2014-08-14 17:20:21
【问题描述】:
ASP.NET 成员如何生成他们的 salt key,然后他们如何对其进行编码(即是 salt + password 还是 password + salt)?
我将SHA-1 用于我的会员资格,但我想重新创建相同的盐,以便内置会员资格的东西可以像我的东西一样散列这些东西。
编辑 2: 没关系。我误读了它,并认为它说的是字节,而不是位。所以我传递的是 128 字节,而不是 128 位。
编辑:我一直在努力做到这一点。这就是我所拥有的,
public string EncodePassword(string password, string salt)
{
byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] src = Encoding.Unicode.GetBytes(salt);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
private byte[] createSalt(byte[] saltSize)
{
byte[] saltBytes = saltSize;
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(saltBytes);
return saltBytes;
}
所以我没有尝试查看 ASP.NET 成员是否会识别这一点,但散列密码看起来很接近。我只是不知道如何将其转换为 base64 的盐。
我做了这个
byte[] storeSalt = createSalt(new byte[128]);
string salt = Encoding.Unicode.GetString(storeSalt);
string base64Salt = Convert.ToBase64String(storeSalt);
int test = base64Salt.Length;
测试长度为 172,远远超过 128 位,所以我做错了什么?
这就是他们的盐的样子
vkNj4EvbEPbk1HHW+K8y/A==
这就是我的盐的样子
E9oEtqo0livLke9+csUkf2AOLzFsOvhkB/NocSQm33aySyNOphplx9yH2bgsHoEeR/aw/pMe4SkeDvNVfnemoB4PDNRUB9drFhzXOW5jypF9NQmBZaJDvJ+uK3mPXsWkEcxANn9mdRzYCEYCaVhgAZ5oQRnnT721mbFKpfc4kpI=
【问题讨论】:
-
你可以在这个 SO 页面上查看我的答案:stackoverflow.com/questions/530426/…
标签: asp.net security hash asp.net-membership