在密码学中,密钥导出函数(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值执行强力搜索。
---------------------
作者:sjrGCkym
来源:CSDN
原文:https://blog.csdn.net/sjrgckym/article/details/78195845
版权声明:本文为博主原创文章,转载请附上博文链接!

PBKDF2

编辑

 
DK = PBKDF2(P,S,c,dkLen)
可选项: RPF 基本伪随机函数(hLen表示伪随机函数输出的字节长度)
输入:
  P 口令,一字节串
  S 盐值,字节串
c 迭代次数,正整数
dkLen 导出密钥的指定字节长度,正整数,最大约(2^32-1)*hLen
输出: DK 导出密钥,长度dkLen字节

密钥导出函数(Key derivation function)的更多相关文章

  1. 写给开发人员的实用密码学(三)—— MAC 与密钥派生函数 KDF

    目录 一.MAC 消息认证码 MAC 与哈希函数.数字签名的区别 MAC 的应用 1. 验证消息的真实性.完整性 2. AE 认证加密 - Authenticated encryption 3. 基于 ...

  2. Mysql导出函数、存储过程

    下面是导出存储过程的代码 1 # mysqldump -u 数据库用户名 -p -n -t -d -R 数据库名 > 文件名 其中,-d 表示--no-create-db, -n表示--no-d ...

  3. DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  4. 导出函数__declspec(dllexport)

    一般而言,动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function). 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用. ...

  5. DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...

  6. 在DLL编程中,导出函数为什么需要extern "C"

    转自:http://blog.csdn.net/zhongjling/article/details/8088664 一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”, ...

  7. DLL声明导出函数的两种方式

    DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport):另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属 ...

  8. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  9. 【转】DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...

随机推荐

  1. Activemq API使用(不整合spring)

    首先需要引入activemq的jar包,这里用的是5.14.4版本的 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ac ...

  2. (转载) win10生成SSH keys

    (转载) win10生成 SSH keys:   SSH key 可以让你在你的电脑和Code服务器之间建立安全的加密连接.  先执行以下语句来判断是否已经存在本地公钥: cat ~/.ssh/id_ ...

  3. (转)淘宝系统信息采集和监控工具tsar

    淘宝系统信息采集和监控工具tsar 项目地址:https://github.com/alibaba/tsar 一.介绍 Tsar是淘宝的系统信息采集和监测工具,主要用来收集服务器的系统信息(如cpu, ...

  4. Docker概念学习系列之Docker是什么?(1)

    不多说,直接上 干货! Docker是什么?   见[博主]撰写的 https://mp.weixin.qq.com/s/iWAzj7baD93hexsVJ7pBfQ  Docker是一个开源的应用容 ...

  5. storm中KafkaSpout的选择

    Storm最常用的消息源就是Kafka,在对接的时候大多需要使用KafkaSpout: 在网上大概有两种KafkaSpout,一种是只有几十行,一种却有一大啪啦类文件. 在kafka中,同一个part ...

  6. 现学现卖】IntelliJ+EmmyLua 开发调试Unity中Xlua

    http://blog.csdn.net/u010019717/article/details/77510066?ref=myread http://blog.csdn.NET/u010019717 ...

  7. mongodb连接失败原因排查

    安装了mongodb,添加了管理员root和test数据库的用户rex,并且开启的用户认证. 按照说明文档连接mongodb数据库:$mongo = new Mongo("mongodb:/ ...

  8. POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  9. TD不换行 nowrap属性

    表格table的td单元格中,文字长了往往会撑开单元格,但是如果table都不够宽了,就换行了好像(不要较真其他情况,我只说会换行的情况).换行后的表格显得乱糟糟,不太好看,我不喜欢这样的换行.当然可 ...

  10. ssm(spring、springmvc、mybatis)框架整合

    第一次接触这3大框架,打算一个一个慢慢学,参照网上资料搭建了一个ssm项目,作为新手吃亏在jar包的导入上,比如jdbc DataSource配置的时候由于导入的jar包不兼容或者缺包导致项目无法正常 ...