【发布时间】:2019-03-09 17:45:23
【问题描述】:
我有一个使用 SHA256 散列的密码。然后我有一个看起来像这样的盐:
AAAAAAAAAAAAAAAAAAAAAA==
在过程结束时,它们都是字节数组,然后我将它们合并到一个新的字节数组中。
我的问题是,在将密码与盐合并时,我的哈希密码在最后缩短了一个字符。
预期输出:
uIxnpgdBQpSPJrqwYucIOeyOyqyCv7HbBfd74ovoxjI=AAAAAAAAAAAAAAAAAAAAAAAAA==
输出:
uIxnpgdBQpSPJrqwYucIOeyOyqyCv7HbBfd74ovoxjIAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
如您所见,在 l 之后缺少一个 =。
我的方法:
public static byte[] HashPassword(byte[] passwordToHash)
{
byte[] hInput;
byte[] hSalt = GetSalt();
using(SHA256 sh = SHA256.Create())
{
hInput = sh.ComputeHash(passwordToHash);
}
byte[] SaltedPw = new byte[(hInput.Length+ 1 ) + (hSalt.Length + 3)];
Array.Copy(hInput,0, SaltedPw, 0,hInput.Length);
Array.Copy(hSalt, 0, SaltedPw, hInput.Length, hSalt.Length);
return SaltedPw;
}
public static byte[] GetSalt()
{
byte[] salt = new byte[16];
return salt;
}
如何防止密码被缩短?
【问题讨论】:
-
在第二个 Array.Copy 中应该是 hInput.Length+1
-
它仍然带走了我的散列密码的“=”
-
@kelalaka: 不,我不应该是
hInput.Length+1,因为第一部分的索引范围是0..Length - 1,Length自动成为第二部分的起始索引。跨度> -
我尝试的是在第一个 Copy 中将 + 1 添加到 hInput.Length ,但这也不起作用。
-
如果你是 Base64 编码连接的字节数组,你将永远在结果中间得到一个
=,Base64 只在末尾添加=如果原始输入的长度不是 3 的倍数,则作为填充字符串。如果您可以 Base64 解码结果并取回正确的原始输入,那么看起来一切正常。
标签: c# arrays .net security password-protection