实用密码学
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
1446 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
开篇词 | 人人都要会点密码学
免费
02|单向散列函数:如何保证信息完整性?
03|如何设置合适的安全强度?
课程目录
已完结/共 24 讲
开篇词 (1讲)
开篇词 | 人人都要会点密码学
课前必读 (1讲)
01 | 学习密码学有什么用?
学会使用哈希函数 (4讲)
02|单向散列函数:如何保证信息完整性?
03|如何设置合适的安全强度?
04|选择哈希算法应该考虑哪些因素?
05|如何有效避免长度延展攻击?
学会使用加密算法 (15讲)
06|对称密钥:如何保护私密数据?
07 | 怎么选择对称密钥算法?
08 | 该怎么选择初始化向量?
加餐 | 密码学,心底的冷暖
09 | 为什么ECB模式不安全?
10 | 怎么防止数据重放攻击?
11 | 怎么利用解密端攻击?
12 | 怎么利用加密端攻击?
13 | 如何防止数据被调包?
14 | 加密数据能够自我验证吗?
15 | AEAD有哪些安全陷阱?
16 | 为什么说随机数都是骗人的?
17 | 加密密钥是怎么来的?
18 | 如何管理对称密钥?
19 | 量子时代,你准备好了吗?
案例分析 (1讲)
20 | 综合案例:如何解决约会难题?
结束语 (2讲)
结束语 | 深挖坑、广积粮
结课测试 | 这些密码学的知识,你都掌握了吗?
实用密码学
15
15
1.0x
00:00/00:00
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

08 | 该怎么选择初始化向量?

你好,我是范学雷。
上一讲,我们讨论了对称密钥的常见算法,还讲到了序列算法和分组算法。还记得吗?当时,我建议你优先使用序列算法,因为它有着良好的性能和皮实的用法。另外,我还向你推荐了 AES-256 和 AES-128。
但是,由于我们还没有考虑数据分组等因素的影响,所以这个建议的实用性还有待商榷。那么,这一讲,我们就来看看对于分组算法,到底有哪些麻烦?我们又该怎么避免这些麻烦?
其实,这是一个解决起来很复杂的问题。不过,今天我们可以先对问题建立一个初步的认知。
要知道分组算法有哪些麻烦,就要先知道该怎么计算分组算法。

分组算法怎么计算?

我们在上一讲说过,分组算法要对输入数据进行分组,然后按数据分组来进行运算。一个典型的分组算法,一般要由三个部分组成,数据分组、分组运算和链接模式。
我们先来看看数据分组是怎么一回事。
数据分组在加密时,会把明文的输入数据分割成加密函数能够处理的数据块。比如,AES 算法能够处理的数据块大小是 128 位,那么,输入数据就要被分割成一个或者多个 128 位的小数据块。
如果不能整分,就要把最后一个分组补齐成 128 位。这些分组数据的运算结果,组合起来就是密文数据。解密时,执行相反的操作,把补齐数据去掉,再把数据分组组合成完整的明文数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
开篇词 | 人人都要会点密码学
免费
02|单向散列函数:如何保证信息完整性?
03|如何设置合适的安全强度?
04|选择哈希算法应该考虑哪些因素?
08 | 该怎么选择初始化向量?
13 | 如何防止数据被调包?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(9)

  • 彩色的沙漠
    前段时间把项目中对称加密的链接模式由ECB改为了CBC模式。但是向量是固定的前后端约定好的。如果使用不重复的初始化向量又存在发送给后端的保密性问题

    作者回复: 由于初始化向量不需要保密,可以使用明文传输的初始化向量。每一次加密,都附上初始化向量。传输的数据是:初始化向量 + 密文。以前的TLS就是这么做的。 不过,现在CBC也要快退役了,建议换到Chacha20/Poly1305或者AES-GCM。这两个模式我们稍后会讲到的。

    2020-12-11
    4
  • soichir
    使用第二种方案即序列数做为初始化向量,文中提到会遇到分布式序列同步问题, 和攻击者知道序列数的风险。 可以详细解释下吗, 我理解:
    1. 分布式系统下的全局ID应该都有自己成熟的方案,或者是使用数据库自增 或者 redis生成,应该不存在同步问题了吧
    2. 初始化向量本身就是非敏感信息,攻击者知道这些序列值 也不会引入什么风险吧?

    作者回复: #1 就是解决同步问题的办法之一。但是,无论是数据库还是redis,都降低了效率。

    #2,这是一个好问题。我写的时候,也想过,这一句是不是会引来讨论。讨论真的就来了。我们后面会讲对加密算法的攻击。重复的初始化向量,一般来说是没有问题的;但是如果没有注意到这些攻击,重复的和已知的初始化向量,会让攻击变得更容易得手。

    2020-12-12
    2
    2
  • soichir
    项目中加密使用安全随机数函数生成初始化向量,解密处有点不一样,为了兼容历史版本(历史版本使用了固定初始化向量),走了两套分支,即如果是老版本加密的,则使用固定向量解密,否则则使用和密文一起存储的随机初始化向量解密。

    作者回复: 嗯,有的时候为了兼容性,要牺牲很多。如果只是本地存储,可能问题还不大;如果要走网络传递,可能会有安全问题。这个还是进一步要分析数据流的场景,才能确定是不是真的有问题。

    2020-12-12
    1
  • Geek_828b39
    老师,没有明白密钥还有使用次数限制的问题。

    作者回复: 有没有明白初始化向量不能重复的问题?

    2021-08-30
    2
  • Reol
    老师,对于初始化向量IV使用序列数的方法,文中说:使用序列数的一个问题是攻击者能较容易知道每一个IV。

    1)除了序列数,就算采取随机数的方法生成IV,也是明文发送IV+密文数据,攻击者也能知道每个IV吧。IV可公开的情况下,被攻击者知道了全部IV又有什么风险呢?这两个方法应该只是为了让密文不重复?

    2)如果同一个密钥下,采用相同的IV生成了相同密文。攻击者是只能对比猜测明文,而不能直接破解出明文吗?

    作者回复: 1)是的,这两种方法是为了让密码不重复。一般来说,攻击者知道IV并不应该有密码学上的风险。文中的这句话,我表达的有失误。

    2)如果能直接破解出明文,那就意味着加密算法本身是可以逆运算的。一般情况下,我们都假设加密算法本身的强度是足够的。

    2021-08-18
    1
  • 三叶虫tlb
    我做的项目,初始化向量就是重复的。。。当初不明白这个有什么用、有什么安全隐患。
    另外怎样安全把初始化向量发送给对方也是个问题。

    作者回复: 大部分场景下的初始化向量不需要保密。

    2021-04-16
  • Litt1eQ
    感觉使用重复的iv会对安全性产生影响 但是我不太清楚具体影响的程度 一般来说iv会跟着加密之后灯内容一块发送 以我目前所能掌握的知识只能了解到这些 我记得分组密码存在一个ecb模式 这个模式没有iv 希望老师可以普吉一下更多的知识 对于密钥长度的限制是我之前所不了解的 感谢老师

    作者回复: 重复的iv,相同的明文就有相同的密文,文章里有讲的,这是一般的加密不允许的。下一节我们讲ECB模式。

    2020-12-09
  • 天天有吃的
    问题2:密钥使用次数 < 初始化向量次数,可以防止第一个数据分组输出相同的加密后内容,密钥还有什么别的限制呢,按道理密钥没有重复性的要求应该比初始化向量要求更低呀?

    作者回复: 你问题提的都很好!密钥的限制问题,我们后面专门会讲的。

    2020-12-09
  • 天天有吃的
    小白打卡中...
    问题1:初始化向量除了不能重复,这里的位数(文中128位)是怎么确定的?怎么保证尽可能的不重复?除了不重复还有没有什么限制?

    作者回复: 位数是由数据块的大小确定的。使用随机数或者序列数,是两个解决重复问题的措施,文中有讲的。其他的限制就要看具体的链接模式了,有的还有,有的就没有了,或者我还不知道有没有。

    2020-12-09
收起评论
9
返回
顶部