工作需求记载:处理用户隐私数据,AES对称加密工具类,Crypto库及其使用

[复制链接]
发表于 2025-9-4 15:13:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
今天在处理文档时遇到了一个新的接口需求:如何加密收到的入参数据,并把返回的数据解密?在处理涉及用户个人信息和隐私时,通常数据会经过MD5或SHA的算法举行哈希,我们只必要把这些数据做加密处理即可。数据的加密方法千变万化,这里使用最流行的AES加密举例说明。
AES也称Advanced Encryption Standard高级加密标准,他的一大特性是对称加密,也就是不必要像RSA那样必要一把公钥和一把私钥,而是用什么密钥加密,就用什么密钥解密。
在JAVA里,要实现各种加密算法可以使用javax.crypto库其下的各种包,此中最关键的就是javax.crypto.Cipher这个包,比如要实现AES加密,就可以先获取一个cipher实例,指定你要用的加密算法和配置:
  1. Cipher cipher = Cipher.getInstance(AES/ECB/PKCS5Padding);
复制代码
比如我们写一个加密的方法encrypt,必要传入String类型的加密内容,和密钥key,调用cipher的方法并抛出加密失败的异常,那有人就要问了这个key怎么搞,怎么天生密钥?最简朴的随机天生方法就是用UUID的工具随机天生,比如
  1. public static final String randomSecretKey() {
  2.         return UUID.randomUUID().toString().replace("-", "");
  3.     }
复制代码
这里替换掉了连字符是为了克制出现不兼容的问题,后续必要传入key的时间可以直接让
  1. String key = randomSecretKey();
复制代码
但是有了这串字符串的key还不能举行加密,因为AES算法必要的是128位二进制密钥,而不是字符串,也就是说我们还必要一个转换的方法把这串UUID转成AES的密钥。这里必要一个getSecretKey方法举行转换,传入参数为那串字符串的key:
  1. private static SecretKeySpec getSecretKey(final String key) throws Exception {
  2.         //返回生成指定算法密钥生成器的 KeyGenerator 对象
  3.         KeyGenerator kg = KeyGenerator.getInstance("AES");
  4.         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
  5.         secureRandom.setSeed(key.getBytes());
  6.         //密钥长度为 128
  7.         kg.init(128, secureRandom);
  8.         //生成一个密钥
  9.         SecretKey secretKey = kg.generateKey();
  10.         return new SecretKeySpec(secretKey.getEncoded(), "AES")
  11.     }
复制代码
此中SecureRandom是一个随机数天生器,可以指定SHA1PRNG将key作为种子使用SHA1哈希算法天生不重复的随机128位密钥。本身crypto库里就带有KeyGenerator类可以指定必要的加密格式。
一切辅助方法都到位就可以开始写加密方法了:
  1. public static String encrypt(String content, String key) {
  2.         try {
  3.             Cipher cipher = Cipher.getInstance(AES/ECB/PKCS5Padding);
  4.             byte[] byteContent = content.getBytes(UTF-8);
  5.             cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
  6.             byte[] result = cipher.doFinal(byteContent);
  7.             return new String(Base64.getEncoder().encode(result), UTF-8);
  8.         } catch (Exception e) {
  9.             throw new RuntimeException("AES加密失败", e);
  10.         }
  11.     }
复制代码
这里的ENCRYPT_MODE是Cipher里加密用的默认模式,直接调用即可。
由于加密和解密用相同的方式和密钥,就不再赘述解密,只必要替换内里的模式为解密即可:
  1. Cipher.DECRYPT_MODE
  2. byte[] result = cipher.doFinal(Base64.getDecoder().decode(content));
复制代码
要把cipher设置为解密模式,在base64那里还必要一个Decoder解密的方法就行了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表