Loading...

加密解密基础知识

在我们的日常开发过程中,不论是数据存储、数据传输,还是进行权限校验等,都绕不开加解密算法这个话题。可以说一个优秀的加解密算法是确保信息安全的基础,而对于开发者而言,深入了解加解密相关知识,对于日常开发工作大有裨益。

加密算法概览

目前常见的加解密算法主要包括以下几类:

  1. 编码

    编码是指将数据从一种格式转换为另一种格式的过程,目的是为了确保数据可以被不同系统正确理解和处理。编码通常不是为了保护数据的隐私或安全,而是为了兼容性和传输效率。编码是可逆的,意味着接收方可以使用对应的解码方法来恢复原始数据。因此准确来说,编码并不属于加解密范畴,但是在部分情景下,一些对此不太熟悉的开发者仍习惯性地将其作为加密方式进行讨论。

  2. 散列函数(不可逆加密)

    散列算法(Hash Algorithm)可以接收任意长度的数据(通常称为消息或输入),然后通过一个确定的过程将其转换为固定长度的输出,这个输出通常被称为散列值、哈希值、消息摘要或者指纹。

    一些常见的散列算法包括:

    • MD5 (Message Digest 5):MD5 是一种广泛使用的散列函数,能够产生128位(16字节)的散列值。尽管曾经非常流行,但MD5现在被认为不安全,因为它容易受到碰撞攻击。
    • SHA 系列 (Secure Hash Algorithm):包括 SHA-1SHA-2SHA-3
    • HMAC (Hash-based Message Authentication Code):基于散列函数的消息认证码,使用密钥进行散列以确保数据完整性和来源认证。
    • BLAKE2:是基于BLAKE哈希函数家族的一个优化版本,提供了比SHA-2更快的速度和相似的安全保证。
    • RIPEMD-160:一种160位的散列函数,有时用于比特币等加密货币地址生成。
  3. 对称加密(单钥加密)

    在对称加密中,发送方和接收方使用相同的密钥来加密和解密信息,这意味着如果一方想要加密数据,他们将使用一个特定的密钥进行加密,而另一方则需要同样的密钥才能解密数据并读取原始信息。

    一些常见的对称加密算法包括:

    • AES (Advanced Encryption Standard):目前最广泛使用的对称加密标准之一。
    • DES (Data Encryption Standard) 和 3DES (Triple DES):较老的标准,已被更安全的AES所取代。
    • Blowfish:由Bruce Schneier设计的一种分组密码。
    • RC4, RC5, RC6:由Ron Rivest开发的一系列流加密算法。
  4. 非对称加密(公私钥加密)

    非对称加密也称为公钥加密,它使用一对数学上相关的密钥来进行数据的加密和解密:一个公钥(public key)和一个私钥(private key)。这两个密钥中的任何一个都可以用来加密信息,而解密则需要另一个密钥来完成。这种机制的主要特点是,即使知道其中一个密钥(例如公钥),也无法在合理的时间内计算出另一个密钥(私钥)。

    一些常见的非对称加密算法包括:

    • RSA:最流行的非对称加密算法之一,基于大整数因式分解难题。
    • DSA (Digital Signature Algorithm):主要应用于数字签名,不是为了加密数据传输。
    • ECC (Elliptic Curve Cryptography):基于椭圆曲线数学,能提供与RSA相同的安全性但使用更短的密钥。
    • ElGamal:基于离散对数问题,可以用于加密和数字签名。它的安全性依赖于在有限域上计算离散对数的难度。

编码

前文已经说明,编码与加密虽有关联,但它却并不属于加密范畴。编码通常并不能为数据安全提供任何保证,它的作用仅仅是为了提高数据的兼容性和保证数据传输效率。尽管它并不属于加密方案,但它仍然会频繁地参与到各种加密算法的加解密过程中。

Base64

Base64 是一种非常常见的编码方式,它用于将任意的二进制数据转换成文本格式,以便于在原本只支持7位ASCII字符传输的媒介中传输。它广泛应用于电子邮件、HTML表单数据传输以及一些文件编码场景中。

原理

Base64编码的基本思想是将每3个字节(即24个二进制位)的数据映射为4个ASCII字符。由于每个ASCII字符使用6位来表示(而不是通常的8位),所以这种编码方式的名字叫Base64——因为2的6次方等于64,意味着可以表示64种不同的字符。

Base64编码使用的字符集包括:

  1. 26个大写字母(A-Z)
  2. 26个小写字母(a-z)
  3. 10个数字(0-9)
  4. 加号(+)和斜杠(/)

此外,等号(=)用作填充字符。当原始输入的字节数不是3的倍数时,最后可能会剩下1个或2个字节未编码,这时会在编码后的字符串末尾添加一个或两个等号,以确保编码后的字符串长度是4的倍数。

著作権声明

本記事のリンク:https://www.chinmoku.cc/dev/java/others/secret/

本博客中的所有内容,包括但不限于文字、图片、音频、视频、图表和其他可视化材料,均受版权法保护。未经本博客所有者书面授权许可,禁止在任何媒体、网站、社交平台或其他渠道上复制、传播、修改、发布、展示或以任何其他方式使用此博客中的任何内容。

Press ESC to close