数字签名与验签

news/2024/11/29 5:27:43/

前言


  • 数字签名(又称公钥数字签名)是只有发送方才能产生的无法伪造的数字串,是对发送者发送信息真实性的有效证明。
  • 数字签名主要是保证数据有效性(验证是谁发的)和完整性(验证信息是否被篡改)。
  • 数字签名是非对称加密和数字摘要技术的应用。

数字签名流程


A为客户端,C为服务端;

A写邮件给C过程:

  • A用公钥对邮件加密,C收到邮件后用私钥进行解密;

C写邮件给A过程:

  • C写好邮件,用hash函数生成邮件的摘要,将摘要附在邮件上面,这就完成了数字签名,然后,C再使用私钥加密,最后发送给A;
  • A收到邮件后,先把数字签名取下来,然后用公钥解密,若取下的数字签名中的摘要和A的一样,则可判断数据是C发送的。再对邮件使用hash函数,将得到的结果与上一步得到的摘要对比,若两者一致,则可判断数据没有被篡改过;

数字证书


数字证书(CA)是一个权威的证书签发机构。

为了防止公钥被盗窃,安全起见,服务期端C将自己的公钥去证书中心做个认证,过程时CA证书中心会将它的私钥对服务端C的公钥和一些相关信息一起加密,生成数字证书;

  • 服务端C拿到数字证书后,在签名的同时,将数字证书一起发给客户端A;
  • A收到邮件后,用数字证书CA的公钥解开数字证书,就可以拿到服务端C的公钥,这样就可以判断数字签名是否是服务端A的;

签名与验签代码实现


package com.cao.cipher.signature;import com.cao.cipher.rsa.RsaDemo03;
import org.apache.tomcat.util.codec.binary.Base64;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;/*** @author:秋一叶* @date:2020-11-18 17:59* 数字签名,验签*/
public class SignatureDemo {public static void main(String[] args) throws Exception{String input = "原文";//获取私钥,公钥//RsaDemo03类在上一篇博客中:https://blog.csdn.net/qq_36335426/article/details/110480569PrivateKey privateKey = RsaDemo03.getPrivateKey("a.pri", "RSA");PublicKey publicKey = RsaDemo03.getPublicKey("a.pub", "RSA");//签名String signaturedData = getSignature(input, "sha256withrsa", privateKey);System.out.println("生成签名后:" + signaturedData);//验签boolean b = verifySignature(input, "sha256withrsa", publicKey, signaturedData);System.out.println("验签结果:" + b);}/*** 生成签名* @param input 原文* @param algorithm 加密算法* @param privateKey    私钥* @return* @throws Exception*/private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception{//获取签名对象Signature signature = Signature.getInstance(algorithm);//初始化签名signature.initSign(privateKey);//传入原文signature.update(input.getBytes());//开始签名byte[] sign = signature.sign();//对签名进行Base64编码return Base64.encodeBase64String(sign);}/*** 校验签名* @param input* @param algorithm* @param publicKey* @param signaturedData* @return* @throws Exception*/private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception{//获取签名对象Signature signature = Signature.getInstance(algorithm);//初始化签名signature.initVerify(publicKey);//传入原文signature.update(input.getBytes());//校验数据return signature.verify(Base64.decodeBase64(signaturedData));}
}

http://www.ppmy.cn/news/426441.html

相关文章

如何实现《电子签名法》要求的可靠电子签名?

电子文档的电子签名怎么弄?我们在工作中经常需要在一些Word、pdf等电子版文件中插入签名,而很多人可能不知道,电子签名怎么弄?怎么做电子签名才有效? 电子印章或签名图片属于电子签名吗? 当工作或商务交易中…

【数字签名】流程

数字签名 一、引述 大家有没有遇到过如下问题 很多朋友们都会觉得这是自己的系统有问题,或者被病毒攻击等等原因,其实不然,这个问题就是说明的是下载的软件并没有使用微软的数字签名,并非操作系统的问题,所以window在…

不只是CAD电子签名,设计院电子签章还要有这些!

如果说,建筑是面向未来的建设,勘察设计就是站在未来思考现在。当人工智能、物联网、大数据等前沿科技应用在逐渐落地,未来建筑也正在走近我们的生活,更丰富复杂的建筑信息和建设信息、更紧密的设备关联和更智能的建筑,…

电子签名、电子签章、电子印章

从2005年电子签名法颁布实施以来,很多领域都开始广泛使用。网上银行、实体银行、电子政务、电子合同的签署以及电信、银行营业厅等场所。特别是随着互联网的发展,电子签名的应用更广泛。 《中华人民共和国电子签名法》对电子签名的定义是:“…

必备基础:加签验签

必备基础:加签验签 1 密码学相关概念1.1 明文、密文、密钥、加密、解密1.2 对称加密、非对称加密1.3 什么是公钥私钥? 2 加签验签概念3 为什么需要加签验签4 常见加密相关算法简介4.1 消息摘要算法4.1.1 MD家族算法4.1.2 ShA家族算法4.1.3 MAC算法家族 4…

一文了解数字签名、数字证书、自签证书

参考 关于自签SSL证书的一些小知识汇总 对于ssl中的pem文件和key 文件的理解 openssl 生成证书 ca.pem client.pem server.pem SSL:证书文件 数字证书原理 数字签名是什么? 数字签名和数字证书的原理解读(图文) 数字签名和数字证书有哪些区别与联…

【数字签名】如何正确地加签/验签

项目上需要用到数字签名,原本是简单的服务器签名,客户端验签的流程。因为ios端没有找到比较好的验签库,故根据网传的步骤实现验签,但死活验签不成功,折腾了半天。 网上的验签流程: 数字签名的技术流程描述如下&…

对签名验签的理解

1.公钥私钥 1.1一些规则: 公钥加密的数据只有私钥能解开私钥加密的数据只有公钥能解开公钥有很多把,私钥只有一把 注:无需知道原理,只要记住这么个规则 1.2这些规则产生的结论: 下面假设你有一把私钥和公钥&#x…