对加签验签的理解

前言

加签验签模块早已做完了,从刚开始的一脸懵逼,到上线,前前后后两周多吧,现在整理一下思路,记录一下。

什么是加签验签

加签验签,发送消息方,对消息加签名;接受消息方,验证签名是否正确。

为什么要做加签验签

做加签验签的目的主要目的就是,验证消息的完整性

如何做加签验签

简单来说,

发送消息方:

1、根据消息内容形成摘要

2、根据摘要形成签名字段

3、发送消息

接受消息方:

1、接受消息

2、根据消息内容形成摘要

3、根据摘要去验证签名是否正确

详细思路

上面讲的很粗略,这里我们从整个过程来讲解一下。

首先是环境:

  发消息方A、接受消息方B、一个需要发送的消息段[merNo=001,user=zhangm,pwd=abc123,check=6387]、证书生成工具tools.jar

过程:

  1、使用工具生成根证书,用户证书。
    a. 填写工具配置信息。tools会根据消息交互双方的信息+密码生成两个证书,其中双方的信息不重要,重要的是密码。即:保存密码。
    b. tools会生成一个密钥库,密钥库的密码是上一步设置的密码。然后tools还会生成一个密钥对,即公钥和私钥。然后将公钥和私钥存放到密钥库中。最后tools会生成两个证书文件:根证书【可以得到公钥和私钥】、用户证书【可以得到公钥】。
    c. 得到我们想要的东西:根证书、用户证书、密码。其中根证书与密码是一起的,因为从根证书中得到私钥是需要密码的。【注:公钥与私钥其实就是两个字符串】

  2、管理证书

    a. A保存根证书与密码,B保存用户证书。

  3、发送消息
    a. A通过消息[merNo=001,user=zhangm,pwd=abc123,check=6387]形成摘要,摘要的形成方式自行选择,一般来讲是通过整个消息段做摘要。这里提供一个摘要形成方式:对三个消息字段的值进行一个自定义的排序,形成一个摘要,比如:摘要字段[abc123001zhangm6378],这是一种比较简单的摘要形成方式。复杂一点的有先对整个消息通过加密算法进行加密形成加密消息作为摘要。
    b. A通过根证书与密码得到公钥和私钥
    c. A通过公钥和私钥对摘要字段进行签名,形成签名字段。说白了,就是对上一步形成的摘要[abc123001zhangm6378]通过公钥和私钥形成一个加密的串。假设签名字段【加密串】为:w8y98hf。【实际会很长】。
    d. A重新组装消息。将签名字段放到消息体中。[merNo=001,user=zhangm,pwd=abc123,check=6387,sign=w8y98hf]
    e. A发送消息

  4、接收消息
    a. B接收消息
    b. B根据merNo号去匹配对应的用户证书,然后从证书中拿到公钥。
    c. B通过与A协定好的方式,通过消息字段生成摘要[abc123001zhangm6378]
    d. B通过摘要字段[abc123001zhangm6378],公钥,签名字段sign=w8y98hf,去做验证是否正确。

附录:

  本文仅仅是简单的说明了一下整个加签验签的思路,具体细节包括代码就不详细展示了,希望这个思路能给之后的自己提个醒,别忘记就好。

时间: 2024-11-08 22:17:02

对加签验签的理解的相关文章

RSA加密解密及RSA加签验签

RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解密并查看数据:加签验签是私钥加签公钥验签,持有私钥(一人持有)可以加签,持有公钥(多人持有)可以验签. 在金融行业在设计到数据交互传输的时候,需要考虑数据的安全性问题.下文通过介绍RSA的加密和加签两个特性,说明RSA加密技术在保障数据传输过程中的安全性以及实现数据的防篡改和防否机制的应用场景及代码

RSA体系 c++/java相互进行加签验签--转

在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java对客户端的签名进行验签操作.这就涉及到c++ openssl和java之间交互加签验签对客户端身份进行验证的过程. 如果你通过搜索查到我这边文章,相信你一定发现,采用openssl加签后的 数据,在java端却验签不成功,使用openssl验签可以通过.问题在于openssl的公钥发在服务端转换成j

Python中rsa模块【sign 加签验签】的使用

安装 pip install rsa 使用一 说明:简单入门使用  使用公钥加密  ----------->> 使用私钥进行解密 1 # -*- coding:utf-8 -*- 2 import rsa 3 4 5 def rsa_encrypt(d_str): 6 """ 7 生成私钥 和公钥 并接受字符串进行加密 8 :param d_str: 字符串 9 :return: 返回加密结果及私钥 10 """ 11 # 生成公钥和

Java实现RSA密钥对并在加解密、加签验签中应用的实例

一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey.util; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.security.Key; import java.security.KeyPair; import java.security

基于注解的 java 加签验签框架 checksum

checksum 基于 java 注解生成加签验签 checksum. 开源地址:github checksum 创作缘由 原来的代码中,checksum 的生成是用的工具类方法. 后来发现如下的问题: 有些字段太大,不想参与验签,但是无法方便的调整. 不同系统的 checksum 字段不同,只好把工具方法 copy 过去,改来改去. 感觉这样有很大的弊端,完全失去了灵活性. 特性 基于注解的 checksum 加签验签 Fluent 流式语法 支持灵活的策略自定义 更新记录 更新记录 快速开始

ruby md5加签验签方法

# md5签名def md5_sign(data,key) return OpenSSL::Digest::MD5.hexdigest(data+key)end # md5验签def md5_verify(data,sign,key) return true if sign.eql? OpenSSL::Digest::MD5.hexdigest(data+key) return falseend

C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 -变态模式【支持私钥加密,公钥解密】(二)

RSA变态模式:[私钥加密,公钥解密] 一般这种写法都是JAVA弄的..NET原生不支持.为啥,我也不清楚,大概是因为安全性问题吧,毕竟公钥是人人都可是持有的.私钥只有自己拥有. 对接注意事项:https://www.cnblogs.com/kevin860/p/9557845.html 一般方法请看:https://www.cnblogs.com/kevin860/p/9557845.html 签名一直都是[私钥加签.公钥验签]只为证明该消息是你发出来的. 这里使用了BouncyCastle1

RSA加解密&RSA加验签

开发语言与私钥证书的关系如下: 开发语言 私钥格式 证书格式 JAVA .key.p8 .crt PHP .key.pem .cert.pem .NET .key.der .crt 其它 .key.pem .cert.pem 我们是java语言,工程property配置:#商户私钥 PKCS#8标准的私钥 90000002.mer.prikey.path=cert/90000002.key.p8#平台公钥 X.509证书 plat.cert.path=cert/umpay.cert.crt RS

c# 对XML进行数字签名并且让java验签成功

实现: 1.c#将xml报文做数字签名发送到java服务,java服务成功验签. 2.c#服务对收到java服务推送的xml报文成功验签. 前提: 1.java服务要求 资料: 1.msdn:xml签名:https://docs.microsoft.com/zh-cn/dotnet/standard/security/how-to-sign-xml-documents-with-digital-signatures 2.msdn:xml验签:https://docs.microsoft.com/