Java签名

概念


  • 将通信内容的摘要信息使用发送者的私钥进行加密,然后将密文与原文一起传输给信息的接收者,接收者通过发送者的公钥信息来解密被加密的摘要作息,然后使用与发送者相同的摘要算法,对接收到的内容采用相同的方式方式产生摘要串,与解密的摘要串进行对比,如果相同,则说明接收到的内容是完整的,在传输过程中没有受到第三方的篡改,否则说明通信内容已被第三方修改。
  • 签名认证是对非对称加密技术与数字摘要技术的综合运用
  • 数字签名:带有密钥(公钥,私钥)的消息摘要算法。私钥用于签名,公钥用于验证。
  • 作用:验证数据的完整性,认证数据来源,抗否认

场景


  • 签名技术一般利用非对称算法来进行的。则存在一对密钥:公钥和私钥
  • 发送方利用私钥签名,则接受方可以校验发送方的身份,因为私钥是不公开的。但是签名内容是不隐藏的,因为公钥解签是公开的。
  • 发送方利用公钥签名,接收方用私钥解密,则在传输过程中信息是隐藏的,但是不能确定身份,公钥公开,谁都可以发送报文

算法


  • MD5 、SHA1 对关键信息做摘要
  • RSA 对摘要做签名

代码


密钥生成
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithmRSA);
keyPairGenerator.initialize(512);
// 生成密钥
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公私密钥
publicKey = keyPair.getPublic();
privateKey = keyPair.getPrivate();
签名
byte[] infoByte = info.getBytes("UTF-8");
// 先做摘要
MessageDigest md = MessageDigest.getInstance(algorithmMD5);
md.update(infoByte);
byte[] digest = md.digest();
// 进行签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateKey);
signature.update(digest);
byte[] signByte = signature.sign();
signText = Base64.encode(signByte);
System.out.println(signText);
验签
// 生成摘要
byte[] infoByte = info.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance(algorithmMD5);
md.update(infoByte);
byte[] digest = md.digest();
// 进行验签
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey);
signature.update(digest);
boolean result = signature.verify(Base64.decode(signText));
System.out.println(result);
结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值