在做项目中,只要涉及敏感信息,或者对安全有一定要求的场景,都需要对数据进行加密。在Java中原生API即可实现对称加密与非对称加密,并支持常用的加密算法。
对称加密
对称加密使用单钥完成加解密,加密和解密采用相同的密钥。对称加密的速度快,常用于大量数据进行加密。主流的算法有:AES,3DES。
- 生成3DES密钥
<em>/** * 对称加密-3DES算法,取代旧的DES */</em> SecretKey desKey = KeyGenerator.getInstance("DESede").generateKey();
- 生成AES密钥
<em>/** * 生成AES算法的密钥 */</em> SecretKey aesKey = KeyGenerator.getInstance("AES").generateKey();
- 保存密钥
对称密钥一般使用二进制保存
SecretKey desKey = KeyGenerator.getInstance("DESede").generateKey(); <em>// 二进制密钥</em> byte[] bkey = desKey.getEncoded(); <em>// 转成十六进制</em> String keyStr = Hex.byteCoverToString(bkey);
- 读取密钥
可以自己生成随机字符串转成byte数组生成密钥,注意byte长度不能小于24位。
<em>// bkey是byte数组</em> DESedeKeySpec keySpec = new DESedeKeySpec(bkey); <em>// 读取AES密钥</em> SecretKey srtKey = SecretKeyFactory.getInstance("AES").generateSecret(keySpec);
Hex是我自己写的工具类。byte数组和十六进制互转的方法有很多,篇幅有限就不贴出来了。可以引入 Apache Commons Codec 工具类,提供Hex,Base64等常用方法。
非对称加密
非对称加密使用密钥对进行加密。一般使用私密加密,公钥解密,也可以反过来用。但自己加密的数据自己不能解,只能依靠对方解密,可以很好的防止单方面密钥泄露。常用的加密算法有:RSA,DSA。
- 生成密钥对
<em>/** * 可以传RSA或DSA算法 */</em> KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); <em>// 私钥</em> PrivateKey prvKey = keyPair.getPrivate(); <em>// 公钥</em> PublicKey pubKey = keyPair.getPublic();
- 保存密钥
非对称密钥一般使用Base64编码保存。
<em>// 私钥串</em> String prvKeyStr = Base64.getEncoder().encodeToString(prvKey.getEncoded()); <em>// 公钥串</em> String pubKeyStr = Base64.getEncoder().encodeToString(pubKey.getEncoded());
非对称加密对加密内容长度有限制,不能超过192位。虽然可以使用加密数据数流来突破限制,但由于