【发布时间】:2019-12-13 12:19:48
【问题描述】:
我想在 C# 中使用带有胡椒和盐的 PBKDF2 对密码进行哈希处理。我对密码学有点陌生,如果我错了,请随时纠正我。
我使用 Rfc2898DeriveBytes 类是因为(根据其他 Stackoverflow 用户)bcrypt 和其他哈希算法在 C# 中不受本机支持和验证,因此它可能构成安全威胁。这篇文章的目的不是开始讨论哪种散列算法是最好的。 > Bcrypt in C# Stackoverflow
我的目标: 每个密码都会得到一个随机的盐和胡椒,密码会经过一定的迭代次数。
我的问题:与所需的哈希大小相比,输入大小更大是否不好,我的实现是否正确?
- 示例:(PasswordInput (?) + Pepper(16 字节)+ Salt(16 字节)> HashOutput(20 字节)
我的代码
public class GenerateHash
{
//Fields
private const int saltSize = 16;
private const int hashSize = 16;
private const int iterations = 10000;
private const string secretPepper = "Secret 16 Byte pepper.";
//Properties
private string inputId { get; set; }
//Methods
public byte[] GeneratePBKDF2String(string inputId, string secretPepper, int saltSize, int
hashSize, int iterations)
{
// Generate a random salt.
RNGCryptoServiceProvider cryptographicServiceProvider = new RNGCryptoServiceProvider();
byte[] salt = new byte[saltSize];
provider.GetBytes(salt);
// Generate a salted hash with pepper.
Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(inputId + secretPepper, salt, iterations);
return pbkdf2.GetBytes(hashSize);
}
}
我明白:
- 哈希是不可逆的。
- 添加了盐和胡椒以提高安全性并防止彩虹桌攻击。
- 盐是一个唯一且随机的字符串,它不必保密,可以与哈希一起存储在数据库中。
- 辣椒不是唯一的,它用于每个哈希。这是一个秘密,不存储在数据库中。
- 至少应使用 128 位(16 个字节 > 16 个字符)来表示盐和胡椒。
- 算法应至少使用 10.000 次迭代。
【问题讨论】:
标签: c# cryptography pbkdf2