文章目录

  • 前言
  • 一、数字签名简述
  • 二、数字签名算法家谱
  • 三、代码实现
    • 1.引入jar包
    • 2.RSA数字签名实现
  • 总结

前言

数字签名是手写签名在计算机软件应用中的一种体现,同样起到了抗否认的作用。本文介绍什么是数字签名,以及如何用java代码实现数字签名。


一、数字签名简述

数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体。
签名操作只能由甲方完成,验证签名操作则由乙方来完成,用于验证操作的相关信息是由甲方公布给乙方。
与摘要值的表示方法相同,签名值也常以十六机制字符串的形式出现。

二、数字签名算法家谱

三、代码实现

1.引入jar包

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.67</version>
</dependency>

2.RSA数字签名实现

实现细节

算法 密钥长度 密钥长度默认值 签名长度 备注
MD2withRSA 512~65536
(64的倍数)
1024 与密钥长度相同 jdk实现
MD5withRSA
SHA1withRSA
SHA224withRSA 2048 Bouncy Castle实现
SHA256withRSA
SHA384withRSA
SHA512withRSA
RIPEMD128withRSA
RIPEMD160withRSA

代码

public class SignatureUtils {public static final String KEY_ALGORITHM = "RSA";// 数字签名算法public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIVATE_KEY = "RSAPrivateKey";/*** RSA密钥长度默认为1024* 密钥长度必须是64的倍数* 方位在512~65536之间*/private static final int KEY_SIZE = 512;/*** 签名** @param data       待签名数据* @param privateKey 私钥* @return 数字签名* @throws Exception Exception*/public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {// 转换密钥材料PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey priKey = keyFactory.generatePrivate(keySpec);// 实例化Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return signature.sign();}/*** 校验** @param data      待校验数据* @param publicKey 公钥* @param sign      数字签名* @return 校验成功返回true, 失败返回false* @throws Exception Exception*/public static boolean verify(byte[] data, byte[] publicKey, byte[] sign) throws Exception {X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey pubKey = factory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(pubKey);signature.update(data);return signature.verify(sign);}/*** 获取私钥** @param keyMap keyMap* @return 私钥*/public static byte[] getPrivateKey(Map<String, Object> keyMap) {return ((Key) keyMap.get(PRIVATE_KEY)).getEncoded();}/*** 获取公钥** @param keyMap keyMap* @return 公钥*/public static byte[] getPublicKey(Map<String, Object> keyMap) {return ((Key) keyMap.get(PUBLIC_KEY)).getEncoded();}/*** 初始化密钥** @return map* @throws Exception Exception*/public static Map<String, Object> initKey() throws Exception {// 实例化密钥对生成器KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对生成器keyPairGen.initialize(KEY_SIZE);// 生成密钥对KeyPair keyPair = keyPairGen.generateKeyPair();// 公钥RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();// 私钥RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<>();keyMap.put(PUBLIC_KEY, pubKey);keyMap.put(PRIVATE_KEY, priKey);return keyMap;}/*** 私钥签名** @param data       待签名数据* @param privateKey 私钥* @return 十六进制签名字符串* @throws Exception Exception*/public static String sign(byte[] data, String privateKey) throws Exception {return Hex.encodeHexString(sign(data, getKey(privateKey)));}/*** 验证签名** @param data      待验证数据* @param publicKey 公钥* @param sign      签名数据* @return true or false* @throws Exception Exception*/public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {return verify(data, getKey(publicKey), Hex.decodeHex(sign.toCharArray()));}/*** 获取私钥** @param keyMap keyMap* @return 十六进制私钥*/public static String getPrivateKeyStr(Map<String, Object> keyMap) {return Hex.encodeHexString(getPrivateKey(keyMap));}/*** 获取公钥** @param keyMap keyMap* @return 十六进制公钥*/public static String getPublicKeyStr(Map<String, Object> keyMap) {return Hex.encodeHexString(getPublicKey(keyMap));}/*** 获取密钥** @param key 密钥* @return 密钥*/public static byte[] getKey(String key) throws DecoderException {return Hex.decodeHex(key.toCharArray());}}

总结

数字签名算法是公钥基础设施(Public Key Infrastructure,PKI)以及许多网络安全机制(SSL/TLS)的基础,遵从“私钥签名,公钥验签”的签名/验证方式。我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法。

java实现数字签名算法相关推荐

  1. Java之数字签名算法

    目录 数字签名算法概述 数字签名算法--RSA DSA算法列表:MD.SHA两类 主要流程:​ 代码实现: 数字签名算法--DSA DSA算法列表: 主要流程: 代码实现: 数字签名算法--ECDSA ...

  2. java基础----数字签名算法的介绍

    数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.关于数字签名的介绍,可以参见百度百科:http://baike.baidu.c ...

  3. java rsa数字签名_RSA 数字签名算法(Java版)

    数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * RSA签名 ...

  4. RSA 数字签名算法(Java版)

    数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA";/*** RSA签名* ...

  5. dsa的java实现_Java数字签名算法DSA实例详解

    本文实例讲述了Java数字签名算法DSA.分享给大家供大家参考,具体如下: 一.介绍 DSS:Digital Signature Standard 数字签名标准 DSA:Digital Signatu ...

  6. 数字签名算法及JAVA实现案例

    目录 简述 作用 签名流程 验签流程 常用数字签名算法 经典数字签名算法-RSA 简述 数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥.私钥.也就说,数字签名算法是非对称加密 ...

  7. ECDSA数字签名算法(java实现ECDSA签名验签)

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  8. ecdsa JAVA 私钥推导公钥_ECDSA(椭圆曲线数字签名算法)

    ECDSA(Elliptic Curve Digital Signature Algorithm) 一.学习背景--数字签名 在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别 ...

  9. .NET Core加解密实战系列之——消息摘要与数字签名算法

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

最新文章

  1. Spring security防止跨站请求伪造(CSRF防护)
  2. 为什么delete表数据,磁盘空间却还是被占用
  3. Elasticsearch Javascript API增删改查
  4. 委托、多播委托(MulticastDelegate)
  5. hbase 读写调优_hbase优化操作与建议
  6. C/C++ 踩过的坑和防御式编程
  7. 通过webbrowser控件获取验证码
  8. Java 12新功能完整指南
  9. python的模块提供了许多文件处理方法_详解使用Python处理文件目录的相关方法
  10. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——A题 切蛋糕
  11. 动手制作Dos、WinPE、Slax Linux|winpe+dos+Mini Linux U盘启动盘
  12. CCF NOI1117 排序
  13. 基本数据类型与引用数据类型
  14. Mybatis原理解析(一)解析全局xml配置文件生成SqlSessionFactory过程
  15. 正则过滤 emoji
  16. git 中文文件名乱码
  17. abbex 区块链学院如何交易之 第十五章 应对意外
  18. 拼多多库存怎么做|旭宇同创
  19. Ceph分布式存储实战:从0搭建一个存储集群,并把块设备镜像映射到CentOS 7系统上的步骤
  20. 康奈尔本科学计算机要什么条件,康奈尔大学计算机专业申请条件详细解读

热门文章

  1. We7网站群的共享机制
  2. 通过数据泵expdp、impdp方式备份与还原(导出与导入)Oracle数据库
  3. 导入csv文件到数据库
  4. 楚留香服务器维护时间,《楚留香:一梦江湖》11月20日维护更新公告
  5. LABVIEW 2020 强制转换图标在哪里
  6. 百度服务器4月1日维护,2014年4月1日定期维护公告
  7. ERPNext 介绍、安装、建议及资源
  8. Python全国等级考试大纲
  9. 后端思想-如何设计一个操作和管理Excel的业务模块
  10. yarn与npm的区别