Java 加密解密和数字签名

本文详细介绍了Java中对称加密、非对称加密的原理与实践,包括AES、3DES、RSA等算法的使用。同时,讨论了JCE扩展包的安装以支持更大密钥长度,并给出了跨语言加解密时需要注意的问题。此外,还涉及了数字签名在确保数据安全中的作用,以及密钥管理与证书的信任问题。
摘要由CSDN通过智能技术生成

在做项目中,只要涉及敏感信息,或者对安全有一定要求的场景,都需要对数据进行加密。在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位。虽然可以使用加密数据数流来突破限制,但由于

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值