Lujianlong

  • 主页
  • 随笔
  • 相册
所有文章 友链 关于我

Lujianlong

  • 主页
  • 随笔
  • 相册

数字签名算法

2019-05-19

文章导航

× 文章目录
  1. 1. 概述
  2. 2. 分类
  3. 3. RSA(经典数字签名算法)

概述

数字签名算法看以看做是一种带有密钥的消息摘要算法,并且这种算法包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体。

数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。这三点与OSI参考模型中的数据完整性服务、认证服务和抗否认服务。消息摘要算法是验证数据完整性的最佳算法,因此,该算法成为数字签名算法中的必要组成部分。数字签名算法包含签名和验证两项操作,遵循”私钥签名,公钥验证”的签名、验证方式。

分类

数字签名算法主要包含RSA、DSA和ECDSA三种算法。RSA源于整数因式分解问题,DSA和ECDSA算法源于离散对问题。

RSA(经典数字签名算法)

RSA数字签名算法主要分为MD系列(MD2withRSA、MD5withRSA)和SHA系列(SHA256withRSA…)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package signature;

import org.apache.commons.codec.binary.Base64;

import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public class RSACoder {
//数字签名密钥算法
public static final String KEY_ALGORITHM = "RSA";
//数字签名验证算法
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
//公钥
public static final String PUBLIC_KEY = "RSAPublicKey";
//私钥
public static final String PRIVATE_KEY = "RSAPrivateKey";
//密钥长度
private static final int KEY_SIZE = 512;

/**
* 签名
* @param data 待签名数据
* @param privateKey 私钥
* @return 签名
* @throws Exception
*/
public static byte[] sign(byte[] data,byte[] privateKey) throws Exception {
//转换私钥材料
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privateKey);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey key = keyFactory.generatePrivate(encodedKeySpec);
//实现签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(key);
signature.update(data);
return signature.sign();
}

/**
* 校验
* @param data 数据
* @param publicKey 公钥
* @param sign 数字签名
* @return
* @throws Exception
*/
public static boolean vertify(byte[] data,byte[] publicKey,byte[] sign) throws Exception {
//转化公钥材料
X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(publicKey);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicKey1 = keyFactory.generatePublic(encodedKeySpec);

//验证
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicKey1);
signature.update(data);
return signature.verify(sign);
}

/**
* 生成密钥
* @return 返回map
* @throws Exception
*/
public static Map<String,Object> initKey() throws Exception {
//实例化密钥生成器
KeyPairGenerator kg = KeyPairGenerator.getInstance(KEY_ALGORITHM);
//初始化密钥生成器
kg.initialize(KEY_SIZE);
//生成密钥对
KeyPair keyPair = kg.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
Map<String,Object> keyMap = new HashMap<String,Object>();
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}

/**
* 获取密钥
* @param keys
* @param keyType
* @return
* @throws Exception
*/
public static byte[] getKey(Map<String,Object> keys,String keyType) throws Exception {
Key key = (Key) keys.get(keyType);
return key.getEncoded();
}

public static void main(String[] args) throws Exception {
Map<String, Object> stringObjectMap = initKey();
byte[] publicKey = getKey(stringObjectMap,PUBLIC_KEY);
byte[] privateKey = getKey(stringObjectMap,PRIVATE_KEY);
System.out.println("publicKey:"+ Base64.encodeBase64String(publicKey));
System.out.println("privateKey:"+Base64.encodeBase64String(privateKey));

String data = "好好的真好";
byte[] sign = sign(data.getBytes("utf-8"), privateKey);
System.out.println("sigm:"+Base64.encodeBase64String(sign));

boolean vertify = vertify(data.getBytes("utf-8"), publicKey, sign);
System.out.println(vertify);
}

}

//输出结果
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIIVQs0rBCjkv+zHaOcYxf7h/EqiiFy2uL3HYR+uuKLrZejCP7jyV6bl8CpjYba2i3QJ5XJUqS4F75wNtRWJcskCAwEAAQ==
privateKey:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAghVCzSsEKOS/7Mdo5xjF/uH8SqKIXLa4vcdhH664outl6MI/uPJXpuXwKmNhtraLdAnlclSpLgXvnA21FYlyyQIDAQABAkAwegnd+aTgNHcNnzaJwKKwnLjve2iD3Jg2KSIZs3wdQkGsYPBbqNcejIkjWzJbdD9yVGFVwUWVkybN8RPiHP+NAiEAyDK9MKAtEqIWT5N8njQcucBF+bi4YH7PlQfSyLRVk1cCIQCmV2n7T6Qw47EYxA3VNRH5du4X1ODKS4WCY211Ywx23wIhAICRVT6tH0UgIwPny9gtz2TbPhUps/8EcXtcEtoiNfLxAiAfnMdIepdCr1MN2NykI2TaGy8emldqOrYR1KGNyJgq0wIhAJTqd/ph9KZ/zNFuS+wJ6Rs9vTV9Au6gDlEtZBjprRw8
sigm:CWwRHLBoRhTXorroPahfJyAlBfPg3P+AQgNU6SY/r6rgRV9TVjSG5o8Ytmz61xEzCPNcNQyxfwrjhtVRtJrgGQ==
true

本文作者: Lujianlong
本文链接: http://yoursite.com/2019/05/19/数字签名算法/
本文访问量:131 次
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
知识共享许可协议
赏

谢谢你请我吃糖果

支付宝
微信
  • 密码学基础
  • 数字签名算法

扫一扫,分享到微信

微信分享二维码
高等数据加密--非对称加密算法
数字证书
© 2019 Lujianlong
本站总访问量35846人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • 密码学基础
  • Base64算法
  • yillia
  • yilia
  • helper_live2d
  • mysql
  • gitment评论系统
  • 加密与解密类
  • 密钥生成器
  • springboot
  • caching
  • SpEL表达式
  • 静态资源映射规则
  • 日常bug
  • JDBC driver异常
  • maven
  • 本地jar包引入
  • java.security包
  • oracle
  • sql
  • servlet三大组件的注册
  • java
  • ini4j的使用
  • 分页查询
  • Monogdb进阶
  • java8
  • stream
  • LifecycleException解决思路
  • 使用方法
  • lombok
  • swagger2
  • devtools
  • vue
  • vue组件介绍
  • vue项目的搭建
  • vue父子组件间传值
  • 添加依赖
  • mongodb进阶
  • 多数据源
  • docker
  • 安装mysql
  • 虚拟机的安装
  • 对称加密算法
  • git
  • GIT 项目并托管到 GITHUB 仓库
  • 日常bug记录
  • 数字签名算法
  • github
  • 消息摘要算法
  • 证书和密钥的存储类
  • slf4j引入异常
  • ASN.1
  • 日志
  • Log4j日志配置
  • druid和jpa的简单使用
  • markdown
  • 配置文件的注入
  • 实现HttpServletRequest.getInputStream多次读取
  • druid和mysql的简单使用
  • 数字证书
  • 手撸ini文件的读写和修改
  • 自定义starter
  • 非对称加密算法

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • maven项目中引入本地jar包

    2019-10-21

    #maven#本地jar包引入

  • oracle使用sql语句删除某用户下所有的表

    2019-10-21

    #oracle#sql

  • MySQL的sql语句整理(超详细)

    2019-10-21

    #mysql

  • Springboot中基于注解使用缓存

    2019-08-20

    #springboot#caching

  • Spring Boot中整合Druid和Jpa实现简单的curd

    2019-08-18

    #springboot#druid和jpa的简单使用

  • springboot中集成druid和mybatits

    2019-08-15

    #springboot#druid和mysql的简单使用

  • 在docker中安装mysql详细攻略

    2019-08-13

    #docker#安装mysql

  • 自定义starter(实现HttpServletRequest重复读取)

    2019-08-13

    #springboot#自定义starter

  • Markdown语法整理(超详细)

    2019-07-31

    #markdown

  • SpringBoot中servlet三大组件的注册[Servlet,Filter,Listener]

    2019-07-24

    #springboot#servlet三大组件的注册

  • ASN.1入门(超详细)

    2019-07-18

    #ASN.1

  • SpringBoot的静态资源映射规则

    2019-07-16

    #springboot#静态资源映射规则

  • Springboot配置文件值注入

    2019-07-04

    #springboot#配置文件的注入

  • SpEL(Spring表达语言)表达式详述

    2019-07-04

    #springboot#SpEL表达式

  • 实现HttpServletRequest.getInputStream多次读取

    2019-06-28

    #日常bug#实现HttpServletRequest.getInputStream多次读取

  • Log4j日志配置

    2019-06-28

    #日志#Log4j日志配置

  • vue父子组件间传值

    2019-06-22

    #vue#vue父子组件间传值

  • vue组件介绍

    2019-06-22

    #vue#vue组件介绍

  • 前端项目中怎么添加依赖

    2019-06-22

    #vue#添加依赖

  • vue项目的搭建和常见问题的解决

    2019-06-22

    #vue#vue项目的搭建

  • mongodb多条件分页查询的三种方法

    2019-06-09

    #分页查询#Monogdb进阶

  • 多数据源mongodb的使用

    2019-06-08

    #mongodb进阶#多数据源

  • 手把手教你实现类似ini4j的方式创建读取和修改.ini文件(支持section)

    2019-06-07

    #java#手撸ini文件的读写和修改

  • java使用ini4j读写和修改ini配置文件(支持section)

    2019-06-07

    #java#ini4j的使用

  • JAVA8新特性之stream

    2019-05-19

    #java8#stream

  • Base64算法

    2019-05-19

    #密码学基础#Base64算法

  • 消息摘要算法(进阶)

    2019-05-19

    #密码学基础#消息摘要算法

  • 初等数据加密--对称加密算法

    2019-05-19

    #密码学基础#对称加密算法

  • 高等数据加密--非对称加密算法

    2019-05-19

    #密码学基础#非对称加密算法

  • 数字签名算法

    2019-05-19

    #密码学基础#数字签名算法

  • 数字证书

    2019-05-19

    #密码学基础#数字证书

  • JCE加密和解密(基础篇)

    2019-05-19

    #密码学基础#加密与解密类

  • KeyGenerator和KeyPairGenerator

    2019-05-19

    #密码学基础#密钥生成器

  • 证书和密钥的存储类

    2019-05-19

    #密码学基础#证书和密钥的存储类

  • 数字签名算法

    2019-05-19

    #密码学基础#数字签名算法

  • java.security包的部分类详解

    2019-05-19

    #密码学基础#java.security包

  • 消息摘要算法

    2019-05-19

    #密码学基础#消息摘要算法

  • 密码学基础

    2019-05-19

    #密码学基础

  • 三个简化开发的小技巧

    2019-05-19

    #lombok#swagger2#devtools

  • You must configure either the server or JDBC driver (via the serverTimezone conf解决办法

    2019-05-19

    #日常bug#JDBC driver异常

  • org.apache.catalina.LifecycleException解决办法

    2019-05-19

    #日常bug#LifecycleException解决思路

  • 安装虚拟机时趟过的坑

    2019-05-19

    #日常bug#虚拟机的安装

  • 解决slf4j导入失败

    2019-05-19

    #日常bug#slf4j引入异常

  • 将一个已存在的目录转换为一个 GIT 项目并托管到 GITHUB 仓库

    2019-05-19

    #git#GIT 项目并托管到 GITHUB 仓库

  • Hexo yilia主题的使用方法

    2019-05-19

    #yilia#使用方法

  • Hexo博客yilia主题添加Gitment评论系统

    2019-05-19

    #yilia#gitment评论系统

  • Hexo+yilia添加helper-live2d插件实现宠物动画

    2019-05-19

    #yilia#helper_live2d

  • Hexo+Github实现相册功能

    2019-05-12

    #yillia

  • 无法登陆github官网的解决办法

    2019-05-09

    #github

  • 前端开发兼容ie9趟过的坑

    2019-05-09

    #日常bug记录

  • Hello World

    2019-04-15

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家