我有一个用SHA256哈希的密码。然后我有一个看起来像这样的盐:
AAAAAAAAAAAAAAAAAAAAAA ==
在过程结束时,它们都是字节数组,然后我合并为一个新的…
你做错了。您不能将盐添加到哈希密码。您必须将salt添加到普通密码然后散列。关键是要使当前密码或短密码的哈希值无法识别。
base 64编码仅应用于最终结果,以允许将密码哈希存储为字符串。因此,您将永远不必合并基本64字符串。 Base 64字符串用填充 = 最后得到的长度是4的倍数。所以你永远不会看到一个 = 在中间。
=
public static string GetHashedPassword(string plainPassword, byte[] salt) { byte[] passwordBytes = GetBytes(plainPassword); // Merge the password bytes and the salt bytes var mergedBytes = new byte[passwordBytes.Length + salt.Length]; Array.Copy(passwordBytes, mergedBytes, passwordBytes.Length); Array.Copy(salt, 0, mergedBytes, passwordBytes.Length, salt.Length); // Now hash password + salt byte[] hash; using (var sha = SHA256.Create()) { hash = sha.ComputeHash(mergedBytes); } return Base64Encode(hash); }
你还需要这个:
public static string Base64Encode(byte[] bytes) { return System.Convert.ToBase64String(bytes); } static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; }
为每个密码创建随机salt字节,并将salt作为单独的信息与散列密码一起存储。像这样,每个密码都有不同的盐。这使得 预先计算的字典攻击/彩虹表攻击 不可行。盐不需要加密。您可能还希望将其存储为基本64字符串。要再次获取salt字节,您需要 Convert.FromBase64String() 。
Convert.FromBase64String()