我在一家财富 100 强公司工作,我的任务是将安全性从 SHA1 转移到 SHA-2。这不是我的专业领域,但在我学习密码学时,我正在质疑过时的信息等......
SHA-2 显然比 SHA-1 更需要,但是当安全团队知道密码 + salt 的散列使用的是 SHA,GPU 在破解数十亿散列时速度快得离谱 - 我不明白为什么对于密码,我没有被告知使用 bcrypt 或其他速度较慢的等效项,为什么?
有人向我展示了一张 powerpoint 幻灯片,其中告诉我制作盐 60,000 次。我在整个互联网上进行了搜索,但没有看到任何此类建议或示例。为什么?
我正在使用 C#
string SaltAndPwd = string.Concat(plainTextPassword, salt);
SHA256 sha2 = SHA256Managed.Create();
byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
我想我不是被告知要一遍又一遍地创建盐,而是一遍又一遍地创建哈希。
这个逻辑合适吗?
string plainTextPassword = "aF7Cvs+QzZKM=4!";
string salt = "o9kc5FvhWQU==";
SHA256 sha2 = SHA256Managed.Create();
for(var i = 0; i <= 60000; i++)
{
byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
}
如何使此哈希正常工作?
更新发现powerpoint幻灯片
代码更新 - 哈希验证的实现问题
问题是当我对我正在尝试的代码使用检查时
if (resultHash.Equals(hassPassword))
并且不匹配...
public string BuildVerify()
{
string password = "";
string salt = "";
byte[] result;
using (var sha256 = SHA256.Create())
{
password = "hovercraft";
// step 1: you can use RNGCryptoServiceProvider for something worth using
var passwordHashing = new PasswordHashing();
salt = passwordHashing.CreateRandomSalt();
// step 2
string hash =
Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + password)));
// step 3
result = sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + hash));
// step 4
for (int i = 0; i < 60000; i++)
{
result =
sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + Convert.ToBase64String(result)));
}
}
// TESTING VERIFY this works ..
string SaltAndPwd = string.Concat(password, salt);
SHA256 sha2 = SHA256Managed.Create();
byte[] buff = sha2.ComputeHash(Encoding.Unicode.GetBytes(SaltAndPwd));
string resultHash = Convert.ToBase64String(buff);
string hassPassword = Convert.ToBase64String(result);
if (resultHash.Equals(hassPassword))
{
// perfect
}
return "";
}
public class PasswordHashing
{
public string CreateRandomSalt()
{
string password = "";
password = HashPassword.CreateSalt(8) + "=";
password = password.Replace("/", "c");
return password;
}
}
///
public static string CreateSalt(int size)
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);
}
新问题 我想我会继续提出一个新问题,在此先感谢大家。 Verification of Hashing password is not working
最佳答案
I do not get why for passwords i'm not being told to use bcrypt or another equivalent that is slow
我猜这就是为什么他们要你哈希 60000 次。添加工作因素并减缓暴力攻击。
How do I make this hashing to work properly?
像这样:
using (var sha256 = SHA256.Create())
{
string password = "hovercraft";
// step 1: you can use RNGCryptoServiceProvider for something worth using
string salt = GenerateSalt();
// step 2
string hash =
Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + password)));
// step 3
byte[] result = sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + hash));
// step 4
for (int i = 0; i < 60000; i++)
{
result =
sha256.ComputeHash(Encoding.UTF8.GetBytes(salt + Convert.ToBase64String(result)));
}
}
关于c# - 密码哈希 - 为什么加盐 60,000 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342435/