开发中需要知道的密码学知识

2023年 7月 25日 49.4k 0

阅读完本篇文章,你可以知道:

  • 什么是对称加密?
  • 什么是非对称加密?
  • 单向散列函数的应用
  • 数字签名是什么?
  • 数字证书是什么?
  • 概要

    无论加密系统实现的算法如何不同、形式如何复杂,其基本组成部分是相同的,通常都包括四个部分:

    (1)需要加密的初始消息,即明文M。

    (2)用于加密或解密的钥匙,即密钥K。

    (3)加密算法E或者解密算法D。

    (4)加密后形成的消息,即密文C。

    C=Ek(M)表示对明文M使用密钥K加密后得到密文C;同样,M=Dk(C)表示对密文C解密后得到明文M

    对称加密

    对称密钥加密技术又称为传统密钥加密技术,它是指在一个加密系统中通信双方使用同一密钥,或者能够通过一方的密钥推导出另一方的密钥的加密体制

    在使用对称密钥加密时,信息交互的双方必须使用同一个密钥,并且这个密钥还要防止被他人窃取。另外,还要经常对所使用的密钥进行更新,以减少攻击者获取密钥的概率。因此,对称密钥加密技术的安全性依赖于密钥分配技术。

    对称密钥加密技术的特点在于效率高、算法简单、易于实现、计算开销小,适合于对大量数据进行加密。它的最大缺点是密钥的安全性得不到保证,易被攻击。所以,密钥分发、密钥保存、 密钥管理 都是对称密钥加密的缺点。

    在实际应用中,常用的对称密钥加密技术有DES算法、AES算法等。·

    DES算法:数据加密标准(Data Encryption Standard),是由IBM公司研制的一种加密算法。DES是一个分组加密算法,以64位为分组对数据加密。加密和解密使用的是同一个密钥。它的密钥长度是56位。64位的明文从算法的一端输入,经过左右部分的迭代和密钥的异或、置换等一系列操作,从另一端输出。

    ·AES算法:高级加密标准(Advanced Encryption Standard),是由美国国家标准技术协会(NIST)在2001年发布的。AES也是一种分组密码,用以取代DES。AES作为新一代的安全加密标准,集合了强安全性、高性能、高效率、易用和灵活等优点,其分组长度为128位,密钥长度为128位、192位或256位。

    非对称加密

    背景:对称密码系统的一个严重缺陷是在任何密文传输之前,发送者和接收者必须使用一个安全信道预先商定和传送密钥。在实际的通信网中,通信双方很难确定一条合理的安全通道

    公开密钥加密技术又称为非对称密钥加密技术,非对称加密为数据的加密与解密提供了一个非常安全的方法,使用一对密钥:公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。如果通信双方需要互发消息,那么应该建立两套非对称加密的机制(即两对公私钥密钥对),发消息的一方使用对方的公钥进行加密,接收消息的一方使用自己的私钥解密。

    例如:你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人——银行才能对你的消息解密。 与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

    使用公钥加密技术,通信双方事先不需要通过通信信道进行密钥交换,并且公钥是公开的,因此密钥的持有量得到了减少,密钥保存量少,密钥分配简单,便于密钥的分发与管理。常用的公开密钥加密算法有RSA算法、DH算法等

    当前应用最为广泛的公钥系统RSA(Rivest、Shamir、Adleman三人名字的缩写)是基于大数因子分解的复杂性来构造的,它是公钥系统最典型的加密算法,大多数使用公钥加密技术进行加密和数字签名的实际应用都是使用的RSA算法。RSA算法如下:

    (1)用户选择两个足够大的保密素数p、q。

    (2)计算n=pq,n的欧拉函数为F(n)=(p-1)(q-1)。

    (3)选择一个相对比较大的整数e作为加密指数,使e与F(n)互素。

    (4)解方程:ed=1modF(n),求出解密指数d。

    (5)设M、C分别为要加密的明文和已被加密的密文;加密运算为C=Me mod n,解密运算为M=Cd mod n。

    每个用户都有一个密钥(e,d,n),(e,n)是可以公开的密钥PK,(d,n)是用户保密的密钥PR,e是加密指数,d是解密指数。RSA算法的两个密钥中的任何一个都可用来加密,另一个用来解密。RSA算法的安全性基于数论中大数分解为质因子的困难性,从一个公开密钥加密的密文和公钥中推导出明文的难度,等价于分解两个大素数的乘积。可见分解越困难,算法的安全性就越高。DH(Diffie-Hellman)算法是最早的公钥算法,实质上是一个通信双方进行密钥协定的协议,它的用途仅限于密钥交换。DH算法的安全性依赖于计算离散对数的难度,离散对数的研究现状表明所使用的DH密钥至少需要1024位才能保证算法的安全性。

    单向散列函数

    单向散列函数算法也称为报文摘要函数算法,使用单向的散列函数,其实现过程是从明文到密文不可逆的过程。其实就是只能加密而不能将其还原,即理论上无法通过反向运算得到原始数据内容。因此,单向散列函数算法通常通常用来进行数据完整性验证。

    单向散列函数表达式为h=H(M),其中M是一个变长消息,H(M)是定长的散列值。消息正确时,将散列值附于发送方的消息后,接收方通过重新计算散列值认证该消息。散列函数必须具有下列性质:

    (1)M可应用于任意大小的数据块。

    (2)H产生定长的输出。

    (3)对任意给定的M,计算H(M)比较容易,用硬件和软件均可实现。

    (4)对任意给定的散列码h,找到满足H(M)=h的M在计算上是不可行的,称之为单向性。

    (5)对任何给定的分组M,找到满足N不等于M且H(M)=H(N)的N在计算上是不可行的,称之为抗弱碰撞性。

    (6)找到任何满足H(M)=H(N)的(M,N)在计算上是不可行的,称之为抗强碰撞性。由于单向函数在速度上比对称加密算法还快,因此它被广泛应用,是数字签名和消息验证码(MAC)的基础,常用的单向散列函数算法有MD5和SHA-1等。

    数字签名

    背景:前面不管是对称加密还是非对称加密或者是单向散列函数,都是在保证传输的密文不会被破解,使敌人无法知道明文是什么。但是他无法保证消息的来源和完整性。比如A给B发送了一个消息M,敌人截取了消息M,虽然无法破解消息M,但是敌人可以直接替换消息M,随便造一个消息D发给B,B拿到消息D之后进行解密,解密得到的明文并不是A发来的!!!

    现在需要解决2个问题:

  • 消息确定是A发来的
  • 消息在传输的过程中是完整的,没有被篡改。
  • 数字签名是一种认证机制,以公钥技术和单向散列函数为基础,使得消息的产生都可以添加一个起签名作用的标识。签名保证了消息的来源和完整性,即数字签名能验证出数据在传输过程中有无改变,确保传输电子文件的完整性、真实性和不可替代性。

    以下是数字签名的流程:

    数字证书

    至此,我们现在总结一下:

  • 使用非对称加密可以完成基本的数据加密,但是无法保证密钥的安全性,容易被攻击。
  • 使用非对称加密提高了安全性。
  • 单向散列函数一般用于保证数据的完整性,使得明文到密文是不可逆的,比如我们数据库中存储用户的密码时就会使用这个单向散列函数
  • 数字签名保证了消息的来源和完整性。
  • 但是,还遗留一个问题:我怎么知道发送方是可靠的?不是骗子?

    对于非对称加密算法和数字签名来说,很重要的步骤就是公钥的分发。理论上任何人都可以获取到公开的公钥。然而这个公钥文件有没有可能是伪造的呢?或者说我又怎么确定发给我公钥的一方是可靠的呢? 传输过程中有没有可能被篡改呢?一旦公钥自身出了问题,则整个建立在其上的的安全性将不复成立。

    生活案例:

    (1)在路边打车,我如何确定我坐的车是不是黑车?

    (2)去饭店吃饭,如何确定该饭店是可靠的,饭菜是安全的?

    (3).....

    为了解决上述一系列问题,我们在生活中已经看到了解决方案,就是使用证书,为了确定饭店是可靠的,只需要检查该饭店是否拥有经营许可证,餐饮服务许可证等。这些证书是由权威机构颁发的,是可以信任的。

    所以,只要具备了相关的证书,我们就可以基本认为它是具备了相应的资质,是可以被信任的。

    而数字证书就是在网络中可以用来证明身份可靠性的一种证书。一般情况下,证书需要由证书认证机构(Certification Authority,CA)来进行签发和背书。权威的商业证书认证机构包括 DigiCert、GlobalSign、VeriSign 等。用户也可以自行搭建本地 CA 系统,在私有网络中进行使用。

    一般的,一个数字证书内容可能包括证书域(证书的版本、序列号、签名算法类型、签发者信息、有效期、被签发主体、签发的公开密钥)、CA 对证书的签名算法和签名值等。

    目前使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 的 v3 版本规范(RFC 5280),其中定义了如下证书信息域:

    • 版本号(Version Number):规范的版本号,目前为版本 3,值为 0x2;

    • 序列号(Serial Number):由 CA 维护的为它所颁发的每个证书分配的唯一的序列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书。最大不能超过 20 个字节;

    • 签名算法(Signature Algorithm):数字签名所采用的算法,如 sha256WithRSAEncryption 或 ecdsa-with-SHA256;

    • 颁发者(Issuer):颁发证书单位的信息,如 “C=CN, ST=Beijing, L=Beijing, O=org.example.com, CN=ca.org.example.com”;

    • 有效期(Validity):证书的有效期限,包括起止时间(如 Not Before 2018-08-08-00-00UTC,Not After 2028-08-08-00-00UTC);

    • 被签发主体(Subject):证书拥有者的标识信息(Distinguished Name),如 “C=CN, ST=Beijing, L=Beijing, CN=personA.org.example.com”;

    • 主体的公钥信息(Subject Public Key Info):所保护的公钥相关的信息;

      • 公钥算法(Public Key Algorithm):公钥采用的算法;
      • 主体公钥(Subject Public Key):公钥的内容;
    • 颁发者唯一号(Issuer Unique Identifier,可选):代表颁发者的唯一信息,仅 2、3 版本支持,可选;

    • 主体唯一号(Subject Unique Identifier,可选):代表拥有证书实体的唯一信息,仅 2、3 版本支持,可选;

    • 扩展(Extensions,可选):可选的一些扩展。可能包括:

      • Subject Key Identifier:实体的密钥标识符,区分实体的多对密钥;
      • Basic Constraints:一般指明该证书是否属于某个 CA;
      • Authority Key Identifier:颁发这个证书的颁发者的公钥标识符;
      • Authority Information Access:颁发相关的服务地址,如颁发者证书获取地址和吊销证书列表信息查询地址;
      • CRL Distribution Points:证书注销列表的发布地址;
      • Key Usage: 表明证书的用途或功能信息,如 Digital Signature、Key CertSign;
      • Subject Alternative Name:证书身份实体的别名,如该证书可以同样代表 .org.example.com,org.example.com, .example.com,example.com 身份等。

    此外,证书的颁发者还需要对证书内容利用自己的私钥进行签名,以防止他人篡改证书内容。

    证书中记录了大量信息,其中最重要的包括 签发的公开密钥CA 数字签名 ****两个信息。因此,只要使用 CA 的公钥再次对这个证书进行签名比对,就能证明所记录的公钥是否合法。

    那怎么证明用来验证对实体证书进行签名的 CA 公钥自身是否合法呢?

    毕竟在获取 CA 公钥的过程中,它也可能被篡改掉。

    实际上,CA 的公钥是否合法,一方面可以通过更上层的 CA 颁发的证书来进行认证;另一方面某些根 CA(Root CA)可以通过预先分发证书来实现信任基础。例如,主流操作系统和浏览器里面,往往会提前预置一些权威 CA 的证书(通过自身的私钥签名,系统承认这些是合法的证书)。之后所有基于这些 CA 认证过的中间层 CA(Intermediate CA)和后继 CA 都会被验证合法。这样就从预先信任的根证书,经过中间层证书,到最底下的实体证书,构成一条完整的证书信任链。

    某些时候用户在使用浏览器访问某些网站时,可能会被提示是否信任对方的证书。这说明该网站证书无法被当前系统中的证书信任链进行验证,需要进行额外检查。另外,当信任链上任一证书不可靠时,则依赖它的所有后继证书都将失去保障。

    可见,证书作为公钥信任的基础,对其生命周期进行安全管理十分关键。后面章节将介绍的 PKI 体系提供了一套完整的证书管理的框架,包括生成、颁发、撤销过程等。

    以下是申请证书的简单流程:

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论