来说说目前常用的各种加密及其对应实现
加密类型
加密对于特殊数据来说是很重要的,我们也在不断开发新的加密手法来保护数据不被破解。这次我想介绍下目前常用的几种加密方式与其对应的特点。最后会基于 hutool
来完成对应的加密例子,必须引入 hutool
的依赖!!
1 | <dependency> |
对称加密
对称加密是最早出现也是最简单的一种加密方式,加密和解密都是通过一个密钥去实现,具有加密解密速度快的特点,所以适合数据量大的加解密。但缺点也很明显,因为密钥是相同的,所以安全性比较低。
常用的加密方式有 DES、3DES 和 AES 特点:加密解密快,安全性低
非对称加密
非对称加密则是弥补了对称加密的缺点,使用 2 个密钥对数据做处理,公钥用于加密,私钥用于解密。但非对称加密涉及到复杂的数学计算,所以加密解密的速度完全不及对称加密。
常用的加密方式有 RSA、ECC、DSA、ECDSA 特点:加密解密慢,安全性高
散列加密
也叫哈希加密,是一种单向函数。通过将加密的字符串通过哈希算法
映射到固定长度的字符串,映射完成的字符串即为密文。因为是单向函数,所以该加密是不可逆的。
常用的加密方式有 MD5、SHA-256、SHA-1 特点:加密解密快,安全性则需要考虑哈希碰撞所带来的误差
对称加密
AES
对称加密中,我们基本都会使用 AES 来完成。3DES 和 DES 基本已经被 AES 取代。对于 AES 加密,密钥的大小必须是 128 位、192 位或 256 位。注意是位数,不是字节。1 字节等于 8 位,所以这些位数等于 16 字节、24 字节和 32 字节。 而在 Java 中我们一般使用 UTF-8 作为字符编码。所以需要保证密钥为 16 或者 24 或者 32 个字符。
AES 的测试案例如下,我们先创建一个 AES 对象,设置密钥。使用 encryptHex 方法和 decryptStr 方法来完成加密解密。
1 |
|
加密的字符串:[Sora33]
AES 加密后的字符串:[6c8299b16ad9f918c86dd3174852274b]
AES 解密后的字符串:[Sora33]
非对称加密
RSA
rsa 是最早被广泛使用的非对称加密算法之一。一般用于数据加密、数字签名和密钥交换等场景。不过 RSA 的算法性能较低,加密解密的速度较慢。下面是一个 rsa 的案例
1 | // 先获取rsa的私钥和公钥 |
rsa 的私钥:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK4u5HSXON2sq8kiAQ8AvvLZMfYCCy22g4kbTMqG25eodeYzkVSfua8vSjViqwQ6HnjmMPZAxVE+cOOeky1TQFSmM8imHc/+q5aPlQHGNLKyhCkApyGYWdD2s1BtX1hBcxKOQww00B2NqrVMu1ykbXE7YyFJ0/+Bz81q0pl7oexzAgMBAAECgYALcnN7IhEPqHBluIFfTgo+hX2eEEZRy8PbN9sVGEXIMr8E0PDFIfYfCDmVRpW8omEsStx+4oTVMQhUPTCo8uawTaM6t4bHlb88U7m4qEB4xX2316GlnxG2An6ib8l94yW0EcIjdPMxOMUBWAFPDhjIk0FUxt1K/GxQ5W2GMhLXyQJBAONQTdN855EG+UK81Fjskvi7Zkpo+3S0I9o/MEBilgbSU+m2UVzMRY3Y9Umjgz7wPTiGz9b3JJsymCmzaEUa5/cCQQDEKiFxPUhy8ZUZmxybhFVXU1m5L4MeCkzeXKbWY+c4kmhAcY3I0diYj9ORDVM4cc9/vuT2ZSfUpVUCcvaDFNhlAkAl2RkcPY/Q9fhKxGYW6E0QXSOLAC/eHqBZlmvSTJfuStbt8w1ZBioOlDFDMZaIxDdtUgUJJd1Sefob92NFHlXBAkEAsz9AMcZq5kVkFfLLsDu688HBEduddxy4YtPMy8icJvB5fLGGeoNt5PI/w6KmccRlc/iOJawHOmMdC9Da+qpYlQJAXGw42Lgs+/UEqBtqs5PyXuzatwB1Q4EBIVVLkOXqqggM2WywQgXjm2NPAJ0E7LZtG+BEvCjhJj7FT3cEJ4g7gQ==
rsa 的公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuLuR0lzjdrKvJIgEPAL7y2TH2AgsttoOJG0zKhtuXqHXmM5FUn7mvL0o1YqsEOh545jD2QMVRPnDjnpMtU0BUpjPIph3P/quWj5UBxjSysoQpAKchmFnQ9rNQbV9YQXMSjkMMNNAdjaq1TLtcpG1xO2MhSdP/gc/NatKZe6HscwIDAQAB
我们通过刚刚的 rsa 对象,获取其公钥和私钥,将其持久化或保存到配置文件内。然后将公钥和私钥设置为创建 rsa 的参数。
1 |
|
这里需要注意,因为 rsa 的特性,同一个字符串使用同一个公钥去加密,加密后的字符串并不是百分百相同的。但使用对应的私钥是可以完成解密的。
加密后的字符串:EccQydZwLArI0RHIgZfOaFRwh2fZ4eGTz0U/ZVf2wqjKJqsMRgjTDAOzr+P4ljOomuqhUEY4dj+MtruI9ogdDAcGl+Bi3ug18nVRaFh211n8XXt5L2+DkxtuKy2Q52zf/v0/W9lS1SsmdE4qzNTJmt4RpmLxKeAAZa8hdde5wiI=
解密后的字符串:Sora33
散列加密
md5
md5 计算出来的哈希值是 128 位,也就是 32 个字符。由于 md5 的计算速度相对较快,所以用于一些快速计算哈希值的场景以及不是非常重要的数据加密。我们一般配合加盐来提高安全性。
1 |
|
MD5 Hash: 84d6195640683af6b415374db1bce9c0
SHA-256
SHA-256 则是由美国安全局设计的一种加密函数,哈希长度为 256,64 个字符。在安全性上是要比 md5 要好的,但速度上不及 md5。所以我们需要根据实际场景来选择对应的散列加密。
1 |
|
SHA256 Hash: f44640401967122154ae012576f976bf500b377d6048d61e10eff6abbb06b8cc
总结
以上就是我们常用的一些加密方式,每种加密方式都有对应的优缺点。对于特别重要的数据,我们可以选择非对称加密的 RSA 或者 ECC(性能上比 RSA 强),如果是一般且更注重加密的速度可以考虑 AES 或者 md5 加盐加密。