写点什么

更好地随机生成 OpenSSL

  • 2019-10-29
  • 本文字数:2289 字

    阅读完需:约 8 分钟

更好地随机生成OpenSSL

2015 年,AWS 推出了 s2n,它以全新的开源方式来实施 TLS/SSL 协议,保证数据在网络上传输时的私密性和完整性。s2n 的特点是:安全、简单、小巧、快速


该项目发展势头良好,而且应用广泛。2 月份,我们的 CISO Stephen Schmidt 说:“我们已将 Amazon Simple Storage Service (Amazon S3) 商业区域中所有内部和外部 SSL 流量的 OpenSSL 替换为 s2n。”在接下来的几个月,我们还将公布其他使用 s2n 的应用程序。



能够生成安全的随机数字是所有加密协议的重要基础。TLS/SSL 协议使用随机数字生成加密密钥,为所传输的数据提供安全保护。如果随机数字可以预测,那么不管加密本身有多强都没有用,因为密钥本身会泄漏。多年来,尽管创建了许多随机数字生成器,但不幸的是,其中几种并不安全,要么是因为算法遭到入侵并且本身就是可预测或有偏差的,要么是因为随机数字生成器只是勉强基于种子值 (又称“熵”) 进行初始化,而种子值可通过某种方式猜测或泄漏出来。


我们在构建 s2n 时必须选择使用一种安全的随机数字生成器。在对众多生成器的安全性和性能进行评估后,我们选择了采用防预测模式的 AES_CTR_DRBG (即“Advanced Encryption Standard Counter Mode Deterministic Random Bit Generator”[高级加密标准计数器模式确定性随机位生成器] 的缩写)。此生成器的特点是:提供了书面规范、简单、易于理解、以 AES 的安全性为基础、具有参考测试矢量,并且我们可对其进行正式验证。



今年年初,我们使用 Galois 完成了对 AES_CTR_DRBG 实施的检验,并且经过正式验证后确认我们 s2n 中的代码堪比书面规范。


最近,OpenSSLglibc 项目都希望替换他们的随机数字生成器。连同 AES_CTR_DRBG 一起,它们在某种程度上也依赖于 s2n 中的工作,以及可应用于代码的正式验证的可用性。这听起来相当令人兴奋。


但真正让我们感到兴奋的是,在使用 libc 的过程中,我们还能够从 Linux 的另一项重大变革中受益。去年,我们为 Linux 内核推荐了新的 madvise() 选项。该选项基于 OpenBSD 的 MINHERIT_ZERO,可将内存区域标记为 WIPEONFORK,这意味着,在调用 fork() 后可以直接通过一个子进程将这些区域清零。


fork() 调用会复制进程:这是服务器等扩展自身的方式。例如,Web 服务器软件通常会调用 fork() 来为自己创建多个副本,每个副本处理一个或多个不同的连接,并且每个副本都可以在自己的 CPU 核心上运行。通常,在软件调用 fork() 时,会发生间接核分裂:一个进程变成两个,而这两个进程实际上是相同的,而且占用的内存也是相同的。


因此,这会加速扩展并提高其可靠性,但这对于随机数字生成器来说却很危险。原因在于,调用 fork 后,两个进程都会运行相同的生成器,使用相同的种子进行初始化,并且可以生成相同的数字序列。一个进程可能会在公开环境中使用这些随机数字 (例如,启动每条 TLS“hello”消息的随机字节序列),而另一个进程可能会在私有环境中使用它们 (例如,生成密钥)。就安全性而言,这非常危险,因为密钥现在实际上已经公开了。


很长时间以来,s2n 都采用三种“深度防御”缓解措施来应对这个问题。首先,如前所述,s2n 使用所谓的“防预测”模式,这意味着,只要有适当的硬件,s2n 在每次调用时都会为随机数字生成器提供更多的熵 (来自硬件)。其次,s2n 的随机数字生成器按类型归类:每个线程都有一个“公共”生成器和一个“私有”生成器,二者分别进行初始化。最后,s2n 使用“pthread_atfork”调用来检测 fork() 调用并重置随机数字生成器。


设计新的 WIPEONFORK 选项是为了提供比最后一个缓解措施更稳定可靠的缓解方法,因为在某些情况下,可以绕过 pthread_atfork 调用。如果您运行的应用程序绕过 pthread_atfork,对于同时还缺乏硬件熵的平台来说,将只有一层防御可用来应对遭到破坏的随机数字生成器。以下情况十分罕见:极少应用程序会绕过 pthread_atfork,硬件熵现在也很常见,但即使在不常见的情况下,我们也偏向于至少提供两层防御。


WIPEONFORK 无法绕过,因为在进行 fork() 调用时,内核本身也会擦除随机数字生成器内存。新进程将会重新初始化随机数字生成器,确保没有复制风险。


这确实是社区共同努力的结晶。Red Hat 的 Florian Weimer 得到了 Rik Van Riel 的帮助,在连接补丁并指导其完成贡献流程方面,Rik Van Riel 承担了大部分工作。OpenSSL 的 Rich Salz 也做出了重要贡献。在他们的帮助下,该补丁自 9 月初便已纳入 Linus 树和内核操作说明。如今,所有人都可以在 Linux 4.14 版本中使用该补丁。


也就是说,我们可以在自己及客户使用的平台上生成更可靠的随机数字,这是加密安全的基础。


以上只是两个示例,展示了我们加入开源社区的方式。今后,我们还会就此话题展开更多讨论。


了解更多关于 s2n、使用方法以及如何为其做出贡献的信息。


Colm 是 AWS 的首席高级工程师,也是 Apache 软件基金会的老会员。Colm 致力于研究 EC2、加密和 Apache httpd。在业余时间,他喜欢演奏爱尔兰音乐。


作者介绍:


Deirdré Straughan


Deirdré Straughan 是 AWS 开源团队的内容负责人,致力于推广技术和帮助他人开展这方面的工作已有 30 年的时间。截至目前,她撰写了一本书并参与了两本以上书籍的编辑;她还开展和进行技术培训、制作了数百个视频并进行技术讲座直播;此外,她还负责多个技术博客的编写、编辑和管理以及负责技术活动的管理。自 2010 年起,她便利用自己的一技之长,通过各种方式投身云计算,投身开源的时间还要长一些。她于 2017 年 6 月加入 AWS。她的 Twitter 账号是 @deirdres。
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/better-random-number-generation-for-openssl/


2019-10-29 08:00720

评论

发布
暂无评论
发现更多内容

如何实现一个SQL解析器

vivo互联网技术

sql 解析 SQL解析

在线问题反馈模块实战(十八):实现excel台账文件记录批量导入功能

bug菌

springboot 项目实战 10月月更

vue-router学习-1

Studying_swz

前端 10月月更

一种基于柔性事务的分布式事务解决方案设计探究

京东科技开发者

编程 分布式事务 事务 事务回滚 柔性事务

你应该知道的数仓安全:都是同名Schema惹的祸

华为云开发者联盟

数据库 后端 华为云 企业号十月 PK 榜

uniapp H5端精准定位

源字节1号

软件开发 小程序开发

【高并发】深度解析ScheduledThreadPoolExecutor类的源代码

冰河

并发编程 多线程 高并发 协程 异步编程

技术分享 | 测试开发工程师必读经典好书清单,抽奖赠书送福利!

霍格沃兹测试开发学社

Vue_cli2和Vue_cli3

Studying_swz

前端 10月月更

详解Native Memory Tracking 追踪区域分析

华为云开发者联盟

开发 华为云 企业号十月 PK 榜

【网络安全篇】JavaSript基础内容大全

贤鱼很忙

10月月更

复杂场景数据处理的 OLTP 与 OLAP 融合实践

NebulaGraph

数据库 知识图谱

热门探讨:为何数字化转型的企业,大都“死”在了黎明前夕?

优秀

数字化转型

C++精通之路:红黑树

雪芙花

c c++ 10月月更

你真的了解v-model吗🔥

渔戈

前端 Vue3 10月月更

升级全新网络方案,给你低成本、高性能的裸金属体验

华为云开发者联盟

云计算 后端 华为云 云服务器 企业号十月 PK 榜

在线问题反馈模块实战(十七):实现excel模板在线下载功能

bug菌

springboot 项目实战 10月月更

浅析HTML页面的生命周期

CoderBin

html 前端 10月月更

如何实现图像人脸融合?

夏夜许游

人工智能 AI 融合 图像人脸

Vue_Webpack详解

Studying_swz

前端 10月月更

记一个“奇葩”需求的实现

甜点cc

JavaScript 前端 Element UI 10月月更

校招面试真题 | 显式等待与隐式等待的区别?与强制等待的方式分别是什么,有什么区别?

霍格沃兹测试开发学社

【网络安全篇】--HTML基础(预计学习时间:30分钟)从此以后不迷糊~

贤鱼很忙

html 前端 10月月更

牛客刷题系列之进阶版(搜索旋转排序数组,链表内指定区间反转)

雪芙花

c c++ 10月月更

“程”风破浪的开发者|我的js学习小技巧

言程序

JavaScript 学习方法 “程”风破浪的开发者

在线问题反馈模块实战(十六)​:实现查详情功能

bug菌

springboot 项目实战 10月月更

Hybrid app本地开发如何调用JSBridge

甜点cc

JavaScript 前端 Hybrid 10月月更

基于Ernie-3.0 CAIL2019法研杯要素识别多标签分类任务

汀丶人工智能

nlp

算法 | 详解斐波那契数列问题

甜点cc

JavaScript 算法 10月月更 斐波那契数列

HashMap源码分析(六)

知识浅谈

hashmap 10月月更

面试官:数据库加了唯一索引,就不会有重复数据了吗???

小小怪下士

Java MySQL 程序员

更好地随机生成OpenSSL_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章