通过 OpenSSL 深入了解密码学的细节:哈希值、数字签名、数字证书等。
本系列的第一篇文章通过 OpenSSL 库和命令行实用程序介绍了哈希、加密/解密、数字签名和数字证书。这第二篇文章将对细节进行深入探讨。让我们从计算中无处不在的哈希开始,并考虑是什么使哈希函数具备密码学意义。
密码学哈希
OpenSSL 源代码的下载页面包含了一个带有最新版本的表格。每个版本都有两个 哈希值 :160 位 SHA1 和 256 位 SHA256。这些值可以用来验证下载的文件是否与存储库中的原始文件相匹配:下载者在本地重新计算下载文件的哈希值,然后将结果与原始文件进行比较。现代系统有计算这种哈希值的实用程序。例如,Linux 有 md5sum
和 sha256sum
。OpenSSL 本身也提供了类似的命令行实用程序。
哈希值被用于计算的许多领域。例如,比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值,也就是至少有 N 个前导零的哈希值。(N 的值可以上升或下降,这取决于特定时间的挖矿生产力)。作为一个兴趣点,如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期,全球的比特币矿工每秒产生约 7500 万个 太哈希值 —— 这真是一个不可思议的数字。
网络协议也使用哈希值(在这里通常叫做“ 校验和 ”)来支持消息的完整性;也就是说,保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和,并将结果与消息一起发送。当消息到达时,接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致,那么消息在传输过程中可能出现了一些问题,或者发送的校验和出现了问题,或者两者都出现了问题。在这种情况下,应该重新发送消息和它的校验和,或者至少应该触发一个错误情况。(如 UDP 这样的低级网络协议不会理会校验和。)
哈希的其他例子大家都很熟悉。比如一个网站,要求用户用密码进行验证,用户在浏览器中输入密码,然后,他们通过 HTTPS 连接到服务器,密码从浏览器加密发送到服务器。一旦密码到达服务器,就会被解密,然后进行数据库表的查询。
在这个查询表中应该存储什么?存储密码本身是有风险的。风险要小得多的方式是存储一个由密码生成的哈希值,也许在计算哈希值之前“加一些 盐 (额外的位)改善口味”。你的密码可能会被发送到 Web 服务器上,但网站可以向你保证,密码不会存储在那里。
哈希值还出现在安全的各个领域。例如, 基于哈希值的消息认证码 (HMAC)使用一个哈希值和一个秘密的 加密密钥 来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用,在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为 指纹 的哈希值,它可以方便证书验证。一个存放于内存中的 可信存储 可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的 哈希映射 。来自传入的证书的指纹可以与可信存储中的密钥进行比较,以确定是否匹配。
密码学哈希函数 应该具有什么特殊属性?它应该是 单向 的,这意味着很难被逆转。一个加密哈希函数应该是比较容易计算的,但是计算它的反函数(将哈希值映射回输入位串的函数)在计算上应该是困难的。下面是一个描述,用 chf
作为加密哈希函数,我的密码 foobar
作为样本输入。
+--+
hash value—>|chf inverse|—>foobar ## 棘手困难
+--BEGIN PRIVATE KEY--END PRIVATE KEY--BEGIN PUBLIC KEY--END PUBLIC KEY>|server’s public key|>server PMS
+-+ +--+
在这个过程结束时,client
程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个 主密码 ,并立即生成一个称为 会话密钥 的对称加密/解密密钥。现在有两个不同但等价的会话密钥,连接的每一方都有一个。在 client
的例子中,会话密钥是 AES128 类的。一旦在 client
程序和 Google Web 服务器两边生成了会话密钥,每一边的会话密钥就会对双方的对话进行保密。如果任何一方(例如,client
程序)或另一方(在这种情况下,Google Web 服务器)要求重新开始握手,握手协议(如 Diffie-Hellman)允许整个 PMS 过程重复进行。
总结
在命令行上说明的 OpenSSL 操作也可以通过底层库的 API 完成。这两篇文章重点使用了这个实用程序,以保持例子的简短,并专注于加密主题。如果你对安全问题感兴趣,OpenSSL 是一个很好的开始地方,并值得深入研究。
via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-2
作者:Marty Kalin 选题:lujun9972 译者:wxy 校对:wxy
发表回复