我在一家财富100强公司工作,被指派负责将安全性从SHA1转移到SHA-2。这不是我的专业领域,但是随着我学习密码学,我开始对过时的信息产生疑问等等...
我该如何使哈希正常工作?
更新:找到了 PowerPoint 幻灯片。
- 明显需要使用SHA-2而非SHA-1,但当安全团队知道密码+盐值的哈希使用了SHA算法,并且GPU可以快速破解数十亿个哈希时,我不明白为什么他们没有告诉我使用bcrypt或其他慢速哈希等效方法来保护密码,为什么?
- 我被告知要创建60,000次盐值,但我在互联网上搜索并没有看到任何建议或示例,为什么?
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);
}
新问题 我想提出一个新的问题,谢谢大家提前帮助。 验证哈希密码不起作用