OpenSSL 入门:密码学基础知识( 三 )


哈希值来自将任意数量的二进制位映射到固定长度的摘要 。这些位代表什么(会计报告、小说或数字电影)无关紧要 。例如,消息摘要版本 5(Message Digest version 5)(MD5)哈希算法将任意长度的输入位映射到 128 位哈希值,而 SHA1( 安全哈希算法版本 1(Secure Hash Algorithm version 1))算法将输入位映射到 160 位哈希值 。不同的输入位会导致不同的(实际上在统计学上是唯一的)哈希值 。下一篇文章将会进行更详细的介绍,并着重介绍什么使哈希函数具有加密功能 。
数字证书的类型有所不同(例如根证书、中间证书和最终实体证书),并形成了反映这些证书类型的层次结构 。顾名思义,根证书位于层次结构的顶部,其下的证书继承了根证书所具有的信任 。OpenSSL 库和大多数现代编程语言都具有 X509 数据类型以及处理此类证书的函数 。来自 Google 的证书具有 X509 格式,client 程序会检查该证书是否为 X509_V_OK 。
X509 证书基于 公共密钥基础结构(public-key infrastructure)(PKI),其中包括的算法(RSA 是占主导地位的算法)用于生成密钥对:公共密钥及其配对的私有密钥 。公钥是一种身份: Amazon 的公钥对其进行标识,而我的公钥对我进行标识 。私钥应由其所有者负责保密 。
成对出现的密钥具有标准用途 。可以使用公钥对消息进行加密,然后可以使用同一个密钥对中的私钥对消息进行解密 。私钥也可以用于对文档或其他电子工件(例如程序或电子邮件)进行签名,然后可以使用该对密钥中的公钥来验证签名 。以下两个示例补充了一些细节 。
在第一个示例中,Alice 将她的公钥分发给全世界,包括 Bob 。然后,Bob 用 Alice 的公钥加密邮件,然后将加密的邮件发送给 Alice 。用 Alice 的公钥加密的邮件将可以用她的私钥解密(假设是她自己的私钥),如下所示:
+------------------+ encrypted msg+-------------------+Bob's msg--->|Alice's public key|--------------->|Alice's private key|---> Bob's msg +------------------++-------------------+理论上可以在没有 Alice 的私钥的情况下解密消息,但在实际情况中,如果使用像 RSA 这样的加密密钥对系统,则在计算上做不到 。
现在,第二个示例,请对文档签名以证明其真实性 。签名算法使用密钥对中的私钥来处理要签名的文档的加密哈希:
+-------------------+Hash of document--->|Alice's private key|--->Alice's digital signature of the document+-------------------+假设 Alice 以数字方式签署了发送给 Bob 的合同 。然后,Bob 可以使用 Alice 密钥对中的公钥来验证签名:
+------------------+Alice's digital signature of the document--->|Alice's public key|--->verified or not +------------------+假若没有 Alice 的私钥,就无法轻松伪造 Alice 的签名:因此,Alice 有必要保密她的私钥 。
在 client 程序中,除了数字证书以外,这些安全性都没有明确展示 。下一篇文章使用使用 OpenSSL 实用程序和库函数的示例填充更多详细的信息 。
命令行的 OpenSSL同时,让我们看一下 OpenSSL 命令行实用程序:特别是在 TLS 握手期间检查来自 Web 服务器的证书的实用程序 。调用 OpenSSL 实用程序可以使用 openssl 命令,然后添加参数和标志的组合以指定所需的操作 。
看看以下命令:
openssl list-cipher-algorithms该输出是组成 加密算法套件(cipher suite)()的相关算法的列表 。下面是列表的开头,加了澄清首字母缩写词的注释:
AES-128-CBC ## Advanced Encryption Standard, Cipher Block ChainingAES-128-CBC-Hmac-SHA1 ## Hash-based Message Authentication Code with SHA1 hashesAES-128-CBC-HMAC-SHA256 ## ditto, but SHA256 rather than SHA1...下一条命令使用参数 s_client 将打开到 www.google.com 的安全连接,并在屏幕上显示有关此连接的所有信息:
openssl s_client -connect www.google.com:443 -showcerts端口号 443 是 Web 服务器用于接收 HTTPS(而不是 HTTP 连接)的标准端口号 。(对于 HTTP,标准端口为 80)Web 地址 www.google.com:443 也出现在 client 程序的代码中 。如果尝试连接成功,则将显示来自 Google 的三个数字证书以及有关安全会话、正在使用的加密算法套件以及相关项目的信息 。例如,这是开头的部分输出,它声明证书链即将到来 。证书的编码为 base64:
Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3-----BEGIN CERTIFICATE-----MIIEijCCA3KgAwIBAgIQdCea9tmy/T6rK/dDD1isujANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2VzMSUw...


推荐阅读