网站首页

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > Java >

工作需求记录:处理用户隐私数据,AES对称加密

时间:2025-09-04 16:59

人气:

作者:admin

标签:

导读:今天在处理文档时遇到了一个新的接口需求:如何加密收到的入参数据,并把返回的数据解密?在处理涉及用户个人信息和隐私时,通常数据会经过MD5或SHA的算法进行哈希,我们只需要...

今天在处理文档时遇到了一个新的接口需求:如何加密收到的入参数据,并把返回的数据解密?在处理涉及用户个人信息和隐私时,通常数据会经过MD5或SHA的算法进行哈希,我们只需要把这些数据做加密处理即可。数据的加密方法千变万化,这里使用最流行的AES加密举例说明。
AES也称Advanced Encryption Standard高级加密标准,他的一大特性是对称加密,也就是不需要像RSA那样需要一把公钥和一把私钥,而是用什么密钥加密,就用什么密钥解密。
在JAVA里,要实现各种加密算法可以使用javax.crypto库其下的各种包,其中最关键的就是javax.crypto.Cipher这个包,比如要实现AES加密,就可以先获取一个cipher实例,指定你要用的加密算法和配置:

Cipher cipher = Cipher.getInstance(AES/ECB/PKCS5Padding);

比如我们写一个加密的方法encrypt,需要传入String类型的加密内容,和密钥key,调用cipher的方法并抛出加密失败的异常,那有人就要问了这个key怎么搞,怎么生成密钥?最简单的随机生成方法就是用UUID的工具随机生成,比如

 public static final String randomSecretKey() {
        return UUID.randomUUID().toString().replace("-", "");
    }

这里替换掉了连字符是为了避免出现不兼容的问题,后续需要传入key的时候可以直接让

String key = randomSecretKey();

但是有了这串字符串的key还不能进行加密,因为AES算法需要的是128位二进制密钥,而不是字符串,也就是说我们还需要一个转换的方法把这串UUID转成AES的密钥。这里需要一个getSecretKey方法进行转换,传入参数为那串字符串的key:

private static SecretKeySpec getSecretKey(final String key) throws Exception {
        //返回生成指定算法密钥生成器的 KeyGenerator 对象
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(key.getBytes());
        //密钥长度为 128
        kg.init(128, secureRandom);
        //生成一个密钥
        SecretKey secretKey = kg.generateKey();
        return new SecretKeySpec(secretKey.getEncoded(), "AES")
    }

其中SecureRandom是一个随机数生成器,可以指定SHA1PRNG将key作为种子使用SHA1哈希算法生成不重复的随机128位密钥。本身crypto库里就带有KeyGenerator类可以指定需要的加密格式。
一切辅助方法都到位就可以开始写加密方法了:

public static String encrypt(String content, String key) {
        try {
            Cipher cipher = Cipher.getInstance(AES/ECB/PKCS5Padding);
            byte[] byteContent = content.getBytes(UTF-8);
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
            byte[] result = cipher.doFinal(byteContent);
            return new String(Base64.getEncoder().encode(result), UTF-8);
        } catch (Exception e) {
            throw new RuntimeException("AES加密失败", e);
        }
    }

这里的ENCRYPT_MODE是Cipher里加密用的默认模式,直接调用即可。
由于加密和解密用相同的方式和密钥,就不再赘述解密,只需要替换里面的模式为解密即可:

Cipher.DECRYPT_MODE
byte[] result = cipher.doFinal(Base64.getDecoder().decode(content));

要把cipher设置为解密模式,在base64那里还需要一个Decoder解密的方法就行了。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信