Ran*_*pho 11
我们前一段时间就盐渍密码的最佳实践进行了很好的讨论,你可能会在那里找到一些好主意:
我发现最简单的一个,虽然仍然相当安全,但是使用GUID作为你的盐.它是随机的,足够长.如果您包含GUID的字符串格式("{"和" - "字符),则效果最佳,但您不必这样做.
请记住,盐对于每个盐渍物品必须是唯一的,并且为了最安全,您应该使用加密安全随机数生成器.还要记住,您必须将盐与密码一起存储,否则您将无法根据哈希版本检查明文版本!如果您愿意,可以将盐保存为未加密的; 我通常将它放在与密码相同的表中的字段中.盐的目的不是保持隐藏,而是让彩虹表难以(希望不可能)及时计算.
这是一个可以在C#中使用的快速代码段:
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[1024];
rng.GetBytes(buffer);
string salt = BitConverter.ToString(buffer);
var saltedPassword = password + salt;
Run Code Online (Sandbox Code Playgroud)
要么...
var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;
Run Code Online (Sandbox Code Playgroud)
我想您是在要求用户名和密码吗?
在某些系统中,用户名用作盐。(我认为这样做是可以的。)否则,您需要将盐存储在某处并在散列之前检索它(如果是随机创建的盐),或者有一个算法将为相同的盐返回相同的盐用户(仅使用普通用户名并不更好)。
个人使用如下代码:
byte[] GetSaltedPasswordHash(string username, string password)
{
byte[] pwdBytes = Encoding.UTF8.GetBytes(password);
// byte[] salt = BitConverter.GetBytes(userId);
byte[] salt = Encoding.UTF8.GetBytes(username);
byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length];
Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length);
Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length);
SHA1 sha = SHA1.Create();
return sha.ComputeHash(saltedPassword);
}
Run Code Online (Sandbox Code Playgroud)