因此,我使用Rcfc2898DeriveBytes类在.NET中将密码哈希到数据库中。
对于散列和存储最终散列和盐分,一切都很好。
但是,在计算如何存储类在散列密码时所经历的迭代次数时,我遇到了一个问题。
在谷歌搜索之后,我只看到它应该存储在密码哈希前面,但我不知道如何做到这一点,以便在以后更改数字(如果不存储迭代,更改将打破旧密码)时,可以检索该数字。
我看到bcrypt会为你做这一切,但是我没有为这个项目添加一个库的奢侈。
存储这个数字的最佳方法是什么,我如何才能做到这一点,这样它就可以恢复,而不仅仅是存储在散列中(一旦我得到它,我将如何将它从散列中分离出来)?
感谢提前给出的任何建议和信息!
发布于 2014-11-24 17:54:26
我在下面的网址上找到了我要找的东西。
https://cmatskas.com/-net-password-hashing-using-pbkdf2/
有关守则如下:
public class PasswordHash
{
public const int SALT_BYTE_SIZE = 24;
public const int HASH_BYTE_SIZE = 20;
public const int PBKDF2_ITERATIONS = 1000;
public const int ITERATION_INDEX = 0;
public const int SALT_INDEX = 1;
public const int PBKDF2_INDEX = 2;
public static string HashPassword(string password)
{
var cryptoProvider = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_BYTE_SIZE];
cryptoProvider.GetBytes(salt);
var hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
return PBKDF2_ITERATIONS + ":" +
Convert.ToBase64String(salt) + ":" +
Convert.ToBase64String(hash);
}
public static bool ValidatePassword(string password, string correctHash)
{
char[] delimiter = { ':' };
var split = correctHash.Split(delimiter);
var iterations = Int32.Parse(split[ITERATION_INDEX]);
var salt = Convert.FromBase64String(split[SALT_INDEX]);
var hash = Convert.FromBase64String(split[PBKDF2_INDEX]);
var testHash = PBKDF2(password, salt, iterations, hash.Length);
return SlowEquals(hash, testHash);
}
}我使用HashPassword方法将我的值保存到数据库中供以后使用。我用ValidatePassword把它们拿回来让我再用一次。它就像一种魅力,允许我根据所需的强度来确定salt和hash的字节大小,以及迭代次数。这些值只是存储在Web/文件中。
谢谢大家的回答!
发布于 2014-11-24 17:10:59
原则上,您根本不必存储迭代量。就像您不需要存储哈希类型,如果您保持它的一致性。
我建议做一些稍微不同的事情:存储包含版本号的单个字节(前缀),从零开始,就在salt & hash之前。这个版本号被链接到迭代次数、散列方法、字符编码方法,当然还有PBKDF2。如果您想升级到更好的协议,只需将01存储为初始字节,并将其与新参数链接。这样您就可以区分旧的样式密码和新的样式了。
通常,只有当用户输入密码时才能升级,因为哈希是不可逆的,所以很难升级迭代次数。
发布于 2014-11-24 16:58:52
看看bcrypt如何在这里存储散列表:What column type/length should I use for storing a Bcrypt hashed password in a Database?
因此,如果您只计划更改迭代,则可以进行以下简单的操作:
$<number of iterations>$<hash>https://stackoverflow.com/questions/27109784
复制相似问题