这是个理论上的问题。假设您有一个要从中派生主密钥的密码。首先用SHA256散列密码,解析并截断计算出的字节为整数,然后使用模运算符,以便它包含在一个范围(即1000-3000)中,并使用这个整数作为Rfc2898DeriveBytes在.NET中的参数,这是安全的吗?
这样做的主要目的是使迭代计数变量。我这样做会失去熵吗?
下面是用于随机化迭代计数的C#代码:
#region Constant Definitions
private const int HASH_SIZE = 512;
private const int ITERATIONS_LOWER_BOUND = 1000;
private const int ITERATIONS_UPPER_BOUND = 2500; //must exceed lower bound
private const uint SALT_SIZE = 256;
#endregion
public static int RandomizeIteration(byte[] Key) {
if (ITERATIONS_UPPER_BOUND <= ITERATIONS_LOWER_BOUND) {
throw new ArgumentOutOfRangeException("Iteration parameters are incorrectly configured.");
}
//Hash the key using SHA256 algorithm
byte[] HashedKey = SHA256.ComputeHash(Key);
long HashSum = Math.Abs((BitConverter.ToInt64(HashedKey, 0)));
Console.WriteLine("Iterations: " + (HashSum % (ITERATIONS_UPPER_BOUND - ITERATIONS_LOWER_BOUND) + ITERATIONS_LOWER_BOUND));
return (int) (HashSum % (ITERATIONS_UPPER_BOUND - ITERATIONS_LOWER_BOUND) + ITERATIONS_LOWER_BOUND);
}发布于 2014-01-29 16:42:33
使用变量迭代计数没有好处。为了验证,必须知道迭代的次数(这不是秘密),所以它也可以用于蛮力强制。您只需要改变计算哈希所需的时间,这是不可取的,应该根据服务器的性能来选择时间。
如果您的意图是向散列过程添加一个秘密(因此攻击者必须猜测迭代次数),那么有更好的方法。添加服务器端秘密的一个好方法是加密password_hash。
https://stackoverflow.com/questions/21435419
复制相似问题