Fork me on GitHub

非对称加密

非对称加密

是什么?

非对称加密:彼此都有私钥和公钥,发消息时用对方公钥去加密,对方会用自己的私钥去解密。

公钥可以公开,每一个想给咱发消息的都能拿到,但私钥是用来解密的,所以不能公开,只能自己拥有。

现在比方说小明想给我发消息,他获取了我的公钥,然后用我的公钥给他想发的消息进行加密 然后我收到消息之后用私钥解密。所以即使是小明,他也不能去解开加密后的信息,因为他没有私钥。

如果有一个人偷取了小明的私钥,那么他可以解密小明收到的所有信息,但他不能解密汤姆发给我的消息 因为他没有我的私钥。

对称加密和非对称加密-1

为什么比对称加密安全?

所以为什么非对称加密比对称加密更安全,因为首先能够解密的钥匙,只有信息接收者有。

比起对称加密

  • 信息接收者和发送者都有解密钥匙,减少了风险。
  • 私钥只有所有者本地存储,不需要通信,减少通信过程中的风险。

在实际运用中,通信时,用公钥加密信息,确保只有持有对应私钥的人才能解密,从而保证信息的保密性。在签名时,用私钥对信息进行签名,接收方用发送方的公钥验证签名的真实性和完整性,从而确认信息的来源和未被篡改。

常见非对称加密算法

  1. RSA(Rivest-Shamir-Adleman):RSA算法是最流行和广泛使用的非对称加密算法,用于数据加密、解密和数字签名。
  2. Diffie-Hellman(DH):Diffie-Hellman算法用于密钥交换协议,允许双方在不安全的通信渠道上协商出一个共享密钥而无需事先共享密钥。
  3. Elliptic Curve Cryptography(ECC):椭圆曲线密码学是一种基于椭圆曲线数学问题的加密算法。它提供与RSA相当的安全性,但使用更短的密钥长度,因此具有更高的效率。
  4. DSA(Digital Signature Algorithm):DSA算法用于数字签名和验证,是一种基于离散对数问题的非对称加密算法。
  5. ElGamal:ElGamal算法是一种基于离散对数问题的非对称加密算法,可用于加密和数字签名。

哈希函数

MD5

是一种常见的哈希函数,通常用于验证数据完整性、数字签名等场景。

特点

  • 固定长度:MD5生成的哈希值通常是128位(16个字节)长。
  • 不可逆:MD5是单向的,即从哈希值无法反推出原始数据。
  • 碰撞概率:尽管MD5被广泛使用,但其存在碰撞(即不同的输入可能生成相同的哈希值)的概率,因此在安全性要求较高的场景中不建议单独使用MD5。

用途

  • 数据完整性验证:MD5可以用于验证数据在传输或存储过程中是否被篡改。
  • 密码存储:在早期,MD5被用于存储用户密码的哈希值,但由于碰撞概率和单向性的特性,现在安全性要求更高的系统通常选择更安全的哈希算法(如SHA-256等)或结合盐(salt)进行密码存储

哈希函数常见问题

使用哈希函数还有几个重要问题需要注意:

签名摘要如何防止篡改

如果能篡改摘要,那么摘要就毫无意义了。篡改请求后在根据篡改的内容在篡改摘要,再牛逼的算法也无法防止这种攻击。所以使用摘要需要配置只有发送端和接收端才知道私密key,让私密key与消息内容一起混合提取摘要。

为什么MD5加盐可以提高安全性?

用户即使用弱密码,或者密码和别人相同,也能得出不同的哈希值。

常见编码

URL编码

URL编码是一种编码机制,用于将任意数据转换成符合URL规范的格式,以便在URL中安全传输。URL编码会将不安全的字符(如空格、特殊字符)转换为“%”后跟随两个十六进制数字。例如:

  • 空格()被编码为 %20
  • 斜杠(/)被编码为 %2F
  • 加号(+)被编码为 %2B

URL编码的主要用途是确保在URL中传输的数据不被误解为URL结构的一部分。

Base64编码

Base64编码是一种用于将二进制数据转换为ASCII字符的编码方法。

示例

假设输入数据为“any”,输入数据长度为3的倍数

  • 输入数据:”any” 长度为3,无需填充。
  • ASCII值:a=97, n=110, y=121
  • 二进制:01100001 01101110 01111001
  • 每6位一组:011000 010110 111001 111001
  • 转换为Base64字符:Y W 5 y
  • 最终编码结果:YW55

这个例子里输入的数据长度,刚好等于3的倍数,但是如果输入长度除以3余2时,需要额外填充1个等于号,输入长度除以3余1时,需要额外填充2个等于号,如下:

假设输入数据为“an”,输入数据长度除以3余2:

  • 输入数据:”an” 长度为2,需要填充1个等于号。
  • ASCII值:a=97, n=110
  • 二进制:01100001 01101110
  • 补齐:01100001 01101110 00000000
  • 每6位一组:011000 010110 111000 000000
  • 转换为Base64字符:Y W 4 A
  • 最终编码结果:YW4A=

Base64编码检测错误

虽然Base64并不提供强大的错误检测和校验机制(如CRC或哈希),但由于编码后的数据具有特定的字符集和填充模式,任何违反这些规则的数据可以被识别为无效,从而提示可能存在的传输或存储错误。例如,如果解码过程中发现字符不在Base64字符表中或填充字符位置错误,就可以判断数据在传输或存储中可能受到了破坏。

常见破译手段

彩虹表(Rainbow Table)是一种用于加速密码破解的预先计算技术。它基于哈希函数的特性和对称加密的概念,通过预先计算和存储大量可能的输入和对应的哈希值,以便在实际攻击时能够快速查找到密码的原始明文。 对抗彩虹表攻击的主要策略包括:

  • 使用盐(Salt):在存储密码的时候,为每个密码添加一个随机的盐值,然后再进行哈希处理。这样即使密码相同,由于盐值不同,最终生成的哈希值也不同,破解者无法通过事先计算好的彩虹表来快速破解密码。
  • 多次哈希(Key stretching):对密码进行多次哈希处理,增加破解的时间成本。例如,使用PBKDF2、bcrypt或scrypt等算法进行多次哈希迭代。