常用加密算法类型:

加密算法:对称加密 (可逆)

常用算法

  • DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;(已经不安全了,)
  • 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
  • AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512 (首选的算法)

特点

  • 指加密和解密用的是同一个秘钥。
  • 加密速度快
  • 秘钥传输过程不安全

加密算法: 非对称加密(可逆)

非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

常用算法

  • RSA: 是一种目前应用非常广泛、历史也比较悠久的非对称秘钥加密技术,由于难于破解,RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等,理论上秘钥越长越难于破解,按照维基百科上的说法,小于等于256位的秘钥,在一台个人电脑上花几个小时就能被破解,512位的秘钥和768位的秘钥也分别在1999年和2009年被成功破解,虽然目前还没有公开资料证实有人能够成功破解1024位的秘钥,但显然距离这个节点也并不遥远,所以目前业界推荐使用 2048 位或以上的秘钥,不过目前看 2048 位的秘钥已经足够安全了,支付宝的官方文档上推荐也是2048位,当然更长的秘钥更安全,但也意味着会产生更大的性能开销。

特点

  • 公钥公开,私钥自己保管
  • 算法复杂,效率低于对称加密,但是更不容易被破解,通常域对称加密混合使用
  • 公钥加密 —> 私钥解密。 主要用于消息的传输
  • 私钥加密 —> 公钥解密。 主要用于数字签名和CA证书。 证书-目的是用于公钥的配送过程中防止被篡改。

加密算法:单项散列函数(Hash)(不可逆)

单向散列函数,又称单向Hash函数、杂凑函数,就是把任意长度的输入消息串变化成固定长的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。一般用于产生消息摘要,密钥加密等

常用算法

  • MD5SHA-1 算法已被攻破,不应该被用于新的用途;SHA-2 与 SHA-3 还是安全的,可以使用。
  • SHA-2包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
  • SHA-3包括:SHA3-224、SHA3-256、SHA3-384、SHA3-512。

主要用于

  • 文件生产摘要,唯一值。
  • 服务器的密码保护,不直接将明文存入数据库,而是将hash后的值存入数据库。
  • 防止数据被篡改。 将传输的数据 生成散列值 后,在对散列值进行签名。 然后再接收端对签名进行校验。
  • 云盘秒传。 只要上传文件的散列值在服务器存有,就不需要上传的步骤。

特点

  • 计算速度快,适用于大文件的计算散列值
  • 不可逆,不能通过散列值反向 推导出以前的内容
  • 无论加密的对象多大,生成的加密大小是一致的

数字签名

CryptoJS 生成AES密钥_https

消息发送者对自己发送的信息进行加密,以证明是自己发送的消息。

主要流程为:

角色:

  • 消息接受者Bob
  • 消息发送者Alice
  1. 消息发送者Alice 将 自己的公钥 发送 给 消息接受者Bob(不安全的,容易被截获)
  2. 消息发送者Alice 将 将要发送的消息用hash函数 --> 生成摘要 --> 再用自己私钥进行非对称加密(签名) --> 生成一段加密后的文字 和 原来的消息(明文) 一并发送出去 (签名+消息)
  3. 消息接受者Bob 用 Alice的公钥对签名 解密得到散列值,再同 消息本身生成的散列值进行对比,来判断消息是否完整与是否是 发送者本人发送的消息。 (解密+对比)

主要 不安全的地方在于,接受者保存的公钥并不能证明是发送者本人的公钥,如果有中间人攻击的话,可能保存的是中间人的公钥。 所以引入了证书的概念

不能证明 公钥的 所属人。

CryptoJS 生成AES密钥_接受者_02

中间人攻击事例:

中间人 在中间,对双发的消息进行 解密后再次加密 转发。

双发都以为是在和对方聊天,其他是在和中间人直接聊天。

CryptoJS 生成AES密钥_https_03

CA证书

CA证书 又名 公钥证书。 由权威机构来证明 公钥的所属人。(包含邮箱姓名和公钥等)

CA是证书的签发机构,它是公钥基础设施(Public Key Infrastructure,PKI)的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。
CA 拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证


CryptoJS 生成AES密钥_CryptoJS 生成AES密钥_04


CryptoJS 生成AES密钥_接受者_05

拥有CA证书的发送消息过程:

  1. 消息接受者Bob 生成秘钥对, 然后将自己的公钥发送给CA机构
  2. CA机构通过一系列手段,进行验证。确认后 用CA的私钥 将Bob的公钥和其个人信息一并 进行数字签名(就是证书),然后放在仓库供使用者下载
  3. Alice从CA机构下载得到Bob的证书, 然后用CA的公钥进行解密验证。 验证成功后得到 Bob的公钥
  4. 消息发送者Alice 将 将要发送的消息用hash函数 --> 生成摘要 --> 再用Bob的公钥进行非对称加密 --> 生成一段加密后的文字 和 原来的消息(明文) 一并发送出去
  5. 消息接受者Bob 用 自己的私钥对密文 解密得到散列值,再同 消息本身生成的散列值进行对比,来判断消息是否完整与是否是 发送者本人发送的消息。

疑问:
数字签名中:步骤2 是用的 自己的私钥进行签名的。
CA证书中: 步骤4 是用的 Bob的公钥进行加密的。

参考:
百度百科
MJ的资料