密钥导出函数(Key derivation function)

来源:互联网 发布:ed视频剪辑软件 编辑:程序博客网 时间:2024/06/05 22:31
简介:
          在密码学中密钥导出函数KDF使用伪随机函数从秘密值(eg.主密钥)导出一个或多个密钥。KDF可用于将密钥扩展到更长的密钥或获得所需格式的密钥(eg.将作为Diffie-Hellman密钥交换的结果的组元素转换为用于AES的对称密钥)密钥加密哈希函数是用于密钥推导的伪随机函数的流行示例。
KDFs的使用:
          密钥导出函数通常与非秘密参数一起使用,以从公共秘密值导出一个或多个密钥。这样的使用可以防止获得派生密钥的攻击者学习关于输入秘密值或任何其他导出密钥的有用信息;也可以使用KDF来确保派生密钥具有其他期望的属性,诸如在某些特定加密系统中避免“弱密钥”。
KDFs最常见的用途是将密码散列的方法来密码验证,我们将非秘密参数称之为salt。KDFs也通常用作多方密钥协商协议的组成部分,这些关键推导函数的示例包括KDF1和ANSI X9.42中的类似功能。特别的,基于HMAC的提取和扩展密钥导出功能(HKDF 是一种简单的基于HMAC的KDF,可用作各种协议和应用程序中的构建块。
我们下面针对密钥延伸(key stretching)对KDF进行下一步的描述:

          KDF也用于从秘密密码或密码短语导出密钥的应用程序,密码通常不具有直接用作加密密钥的所需属性。在这样的应用中,通常建议将密钥导出功能故意缓慢,以阻止对密码或密码输入值的暴力攻击字典攻击

          这种使用可以表示为DK = KDF(Key,Salt,Iterations),其中DK是派生密钥,KDF是密钥导出函数Key是原始密钥或密码,Salt是作为密码的随机数Iterations是指子功能迭代次数使用派生密钥代替原始密钥或密码作为系统的密钥。盐的值和迭代次数(如果不固定)与散列密码一起存储或以加密消息的明文形式发送。

         暴力攻击的难度随着迭代次数的增加而增加。迭代计数的实际限制是用户不愿容忍登录计算机或看到解密消息的可察觉延迟。使用salt可以防止攻击者预先计算派生密钥的字典。

         类似的,当下还有另一种方法叫做密钥强化(key strengthening),使用随机盐扩展键,但是不像密钥延伸一样可以安全地删除salt。这将强制攻击者和合法用户对salt值执行强力搜索。

历史:

         第一个使用密钥延伸并基于密码的密钥导出功能被称为crypt。它将加密通过执行25次迭代的修改的DES加密算法(其中从实时计算机时钟读取的12位数字用于扰乱计算,使用用户密码的前8个字符作为关键字的常数)。生成的64位数字被编码为11个可打印字符,然后存储在Unix密码文件中。虽然当时这是一个很大的进步,但PDP-11时代以来处理器速度的提高可以对隐藏层进行暴力攻击,存储方面的进步使得12位salt的安全性变的不足;同时crypt功能的设计也将用户密码限制为8个字符,这限制了密钥空间,并且不可能形成强密码

        现代基于密码的密钥导出功能,如PBKDF2使用加密散列,如SHA-2,更多的盐(例如64位和更高)和高的迭代计数(通常是数十或数十万)。

        当下提出的NIST需要至少128位的随机salt和NIST认可的密码功能,eg. SHA系列或AES(MD5并不满足)。尽管高吞吐量是通用散列函数中的理想属性,但在防止暴力破解的主要关注点的密码安全应用中也是如此。大规模并行硬件(eg. GPU,FPGA,甚至ASIC)对于强力破解的日益增长的使用已经使合适的算法的选择更加关键,因为良好的算法不仅要强制一定量的计算成本与CPU,而且还抵御了现代大规模并行平台的成本/性能优势。已经为此目的设计了各种算法,包括bcrypt,scrypt。虽然采用bcrypt能保护散列(使大规模的暴力破解变得昂贵和耗时),但大部分包含基于通用md5算法的密码哈希的账户数据受损。

        2017年6月,NIST发布了新版本的数字认证指南表示:“验证者应将存储的秘密(密码)放在表格以抗存储的秘密,应使用适当的单向密钥导出功能进行salt化和hash,KDF将密码,salt和成本因子作为输入,然后生成密码hash,其目的是使每个密码猜测获得密码哈希文件的攻击者尝试昂贵,因此猜测攻击的成本高;并且盐的长度必须至少为32位,并且任意选​​择,以便最小化存储散列之间的盐值碰撞。




原创粉丝点击