【问题标题】:Is it wise to use a variable iteration count in Rfc2898DeriveBytes?在 Rfc2898DeriveBytes 中使用可变迭代计数是否明智?
【发布时间】:2014-02-21 12:17:25
【问题描述】:

这是一个相当理论的问题。假设您有一个要从中派生主密钥的密码。首先使用 SHA256 对密码进行哈希处理是否安全,将计算的字节解析并截断为整数,然后使用模运算符,使其包含在一个范围内(即 1000-3000),并将该整数用作 Rfc2898DeriveBytes 中的参数。网络?

这样做的主要目标是使迭代计数可变。这样做是否会丢失任何熵?

这是用于随机化迭代计数的 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);
        }

【问题讨论】:

    标签: c# .net security encryption hash


    【解决方案1】:

    使用可变迭代计数没有任何好处。为了验证,无论如何都必须知道迭代次数(这不是秘密),因此它也可以用于暴力破解。您只是改变计算哈希所需的时间,这是不可取的,应该根据您的服务器的性能来选择时间。

    如果您的目的是在散列过程中添加一个秘密(因此攻击者必须猜测迭代次数),有更好的方法。添加服务器端机密的一个好方法是加密 password_hash。

    【讨论】:

    • 但是它不会增加对侧信道攻击的安全性吗?
    • @Crossfire - 为了能够暴力破解 PBKDF2,您需要离线攻击(被盗数据库,在本地机器上暴力破解)。在这种情况下,迭代次数是已知的,很明显你需要更多的时间和精力来做更多的迭代。你唯一能猜到的是迭代次数,但你已经知道了。由于除了第一次迭代之外的所有迭代都是对固定长度的输入进行散列处理,因此旁道攻击似乎不太可能适用于 PBKDF2。
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多