数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。关于数字签名的介绍,可以参见百度百科:http://baike.baidu.com/view/7626.htm。今天,我们就开始学习java中数字签名的使用。

项目结构如下:

DSA算法

一、 HuhxDSA.java

package com.huhx.security;import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;import org.apache.commons.codec.binary.Hex;/*** writer: huhx*/
public class HuhxDSA {private final static String src = "http://www.cnblogs.com/huhx";public static void main(String[] args) {// 初始化签名try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();// 执行签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("DSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("SHA1withDSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] result = signature.sign();System.out.println("jdk dsa sign: " + Hex.encodeHexString(result));// 验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("DSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA1withDSA");signature.initVerify(publicKey);signature.update(src.getBytes());boolean bool = signature.verify(result);System.out.println("jdk dsa: " + bool);} catch (Exception e) {// TODO Auto-generated catch block
            e.printStackTrace();}}
}

二、 运行结果如下:

jdk dsa sign: 302d0215009461ae45922c11159d3b6dc4c70eb0748763d23202146f5f9a5eedb36a760cf8b9b1d1d1fdc10636aafe
jdk dsa: true

RSA算法

一、 HuhxRSA.java

package com.huhx.security;import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;import org.apache.commons.codec.binary.Hex;/*** writer: huhx*/
public class HuhxRSA {private final static String src = "http://www.cnblogs.com/huhx";public static void main(String[] args) {try {// 初始化签名KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");generator.initialize(512);KeyPair keyPair = generator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();// 执行签名PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(encodedKeySpec);Signature signature = Signature.getInstance("MD5withRSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] result = signature.sign();System.out.println("jdk rsa sign: " + Hex.encodeHexString(result));// 验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("MD5withRSA");signature.initVerify(publicKey);signature.update(src.getBytes());boolean bool = signature.verify(result);System.out.println("jdk rsa: " + bool);} catch (Exception e) {e.printStackTrace();}}
}

二、 运行结果如下:

jdk rsa sign: 564dc7f96c85a7a42e579ae191997c892f234272d220e3f062cf52071e827164fadd52720b69704979fc11810bdbf92b01dd3f5f26a621ffe699ef601d08fb6c
jdk rsa: true

ECDSA算法

一、 HuhxECDSA.java

package com.huhx.security;import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;import org.apache.commons.codec.binary.Hex;/*** writer: huhx*/
public class HuhxECDSA {private final static String src = "mhttp://www.cnblogs.com/huhx";public static void main(String[] args) {try {// 初始化签名KeyPairGenerator generator = KeyPairGenerator.getInstance("EC");generator.initialize(256);KeyPair keyPair = generator.generateKeyPair();ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();// 执行签名PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("EC");PrivateKey privateKey = keyFactory.generatePrivate(encodedKeySpec);Signature signature = Signature.getInstance("SHA1withECDSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] result = signature.sign();System.out.println("jdk ecdsa sign: " + Hex.encodeHexString(result));// 验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("EC");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA1withECDSA");signature.initVerify(publicKey);signature.update(src.getBytes());boolean bool = signature.verify(result);System.out.println("jdk ecdsa: " + bool);} catch (Exception e) {e.printStackTrace();}}
}

二、 运行结果如下:

jdk ecdsa sign: 30460221009b80596c51ccdf19c5e8e825aca6d85e549a30ee72a1e9b094f7b3a8c8b9310902210098e8dcc6ea932142d8cd9dd80c08fff7359f796571f8a973d3ca6e2dc0931904
jdk ecdsa: true

友情链接

转载于:https://www.cnblogs.com/huhx/p/javaSignature.html

java基础----数字签名算法的介绍相关推荐

  1. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

  2. java基础-Eclipse开发工具介绍

    java基础-Eclipse开发工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 所谓工欲善其事必先利其器,即将身为一名Java开发工程师怎么能没有一款好使的IDE呢?今天就 ...

  3. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  4. java基础-Idea开发工具介绍

    java基础-Idea开发工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前给大家介绍过一款Java的IDE叫eclipse,有些功能用起来不是很得心应手,尤其是在导报的 ...

  5. java实现数字签名算法

    文章目录 前言 一.数字签名简述 二.数字签名算法家谱 三.代码实现 1.引入jar包 2.RSA数字签名实现 总结 前言 数字签名是手写签名在计算机软件应用中的一种体现,同样起到了抗否认的作用.本文 ...

  6. Java之数字签名算法

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

  7. 【Java基础】之 JSR 介绍

    JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人 ...

  8. Java基础篇:简单介绍一下final

    一个变量可以声明为final,这样做的目的是阻止它的内容被修改.这意味着在声明final变量的时候,你必须初始化它(在这种用法上,final类似于C/C++中的const).例如: final int ...

  9. 【Java基础教程】(一)入门介绍篇 · 上:快速掌握核心概念,开启Java世界的探索之旅!这篇Java入门宝典助你翱翔~

    Java基础教程之入门介绍 · 上 本节学习目标 1️⃣ Java发展简史 1.1 诞生 1.2 发展 1.3 分支 2️⃣ 特征 3️⃣ 代码执行过程

最新文章

  1. 【设计模式】 模式PK:策略模式VS状态模式
  2. 技术前沿:Redis推出性能碾压ES和Mongo的大杀器
  3. python课程设计报告总结-上海python课程设计报告目的
  4. [LGP4707] 重返现世
  5. Python中包(package)的调用方式
  6. python课本第二章答案_《Python自然语言处理》答案第一、二章
  7. python磁盘io_python监控磁盘io
  8. 设置跳转到新的actvity之后不可返回
  9. session mysql java_PHP自定义session处理方法,保存到MySQL数据库中
  10. oracle 循环继续,oracle – 是否可以继续从异常循环?
  11. mysql执行语句返回主键_mysql语句insert后返回主键
  12. Linux下使用Netfilter强制清除IPv4 DF标志
  13. hdu6287(分解质因数+二分)
  14. 杂谈之什么是FullGC
  15. 用python写飞机大战过几天不能运行了_最近写的一个飞机大战的程序,写到一半有一个已经写好的函数但不能运用,强行运行程序秒退,百思不得其姐...
  16. 实战:k8s之Longhorn备份恢复-2022.2.26
  17. 微信公众号图文 点击显示图片效果
  18. php简易登录注册PHP+MySQL
  19. JVM 工作原理和即时编译(JIT)
  20. iOS程序员眼中的首次使用产品体验

热门文章

  1. 每天十分钟系列:JS数据操作之神奇的map()
  2. 用注解方式写定时任务
  3. iOS开发-UIScrollView原理
  4. 时间复杂度和空间复杂度[数据结构]
  5. 目前个人计算机使用的电子电路主要是,计算机基础知识理论题库.xls
  6. 将数据流链接到加密转换的流CryptoStream 类
  7. juyter显示决策树图形_决策树分析细分市场
  8. Tailwindcss尤大神都fork了,是未来的趋势?
  9. Port already in use: 1099;
  10. js里面拼接代码和使用ModelAndView