廖雪峰Java10加密与安全-5签名算法-1RSA签名算法
1.数字签名

甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的;而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲发送的。
数字签名:
- 发送方用自己的私钥对消息进行签名:sig = signature(privateKey, "message")
 - 接收方用发送方的公钥验证签名是否有效:boolean vaild = verify(publicKey, sig,"message")。如果publicKey,sig,message任何一个发生改变,签名都是无效的。
 - 数字签名≈混入了私钥/公钥的摘要
 
数字签名的目的:
- 确认信息是某个发送方发送的。只有发送方用自己的privateKey签名,其他人才能用发送方的publicKey验证签名。
 - 发送方不能抵赖他发送了消息。因为用谁的publicKey成功验证的签名,就说明一定是他用自己的privateKey签名的。所以privateKey相当于用户的身份。
 - 数据在传输过程中没有被修改
 
常用数字签名方法:
- MD5withRSA
 - SHA1withRSA
 - SHA256withRSA
 
2代码示例
package com.testList;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
public class SecRSASignature {
    PrivateKey sk;//定义私钥
    PublicKey pk;//定义公钥
    //构造方法1:获取公钥/私钥对
    public SecRSASignature() throws GeneralSecurityException{
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");//使用RSA
        kpGen.initialize(1024);//初始化为1024字节
        KeyPair kp = kpGen.generateKeyPair();//生成公钥、私钥
        this.sk = kp.getPrivate();
        this.pk = kp.getPublic();
    }
    //构造方法2:从保存的字节中提取公钥/私钥
    public SecRSASignature(byte[] pk,byte[] sk) throws GeneralSecurityException{
        KeyFactory kf = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(pk);
        this.pk = kf.generatePublic(pkSpec);
        PKCS8EncodedKeySpec skSpec = new PKCS8EncodedKeySpec(sk);
        this.sk = kf.generatePrivate(skSpec);
    }
    //返回私钥的byte数组
    public byte[] getPrivateKey(){
        return this.sk.getEncoded();
    }
    //返回公钥的byte数组
    public byte[] getPublicKey(){
        return this.pk.getEncoded();
    }
    //获取签名
    public byte[] sign(byte[] message) throws GeneralSecurityException{
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initSign(this.sk);
        signature.update(message);
        return signature.sign();
    }
    //传入message,使用公钥与签名sign进行校验
    public boolean verify(byte[] message,byte[] sign) throws GeneralSecurityException{
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initVerify(this.pk);
        signature.update(message);
        return signature.verify(sign);
    }
    public static void main(String[] args) throws Exception{
        byte[] message = "Hello,使用SHA1withRSA算法进行数字签名".getBytes("utf-8");
        SecRSASignature rsas = new SecRSASignature();
        byte[] sign = rsas.sign(message);
        System.out.println("sign:"+ Base64.getEncoder().encodeToString(sign));
        //使用原有的message、sign进行校验
        boolean verified1 = rsas.verify(message,sign);
        System.out.println("verify:"+verified1);
        //创建新的SecRSASiginature对象,使用原有的sign与新对象进行校验
        boolean verified2 = new SecRSASignature().verify(message,sign);
        System.out.println("verfied with another public key:"+verified2);
        //修改message信息
        message[0]=100;
        boolean verifed3 = rsas.verify(message,sign);
        System.out.println("verified with changed message: "+verifed3);
    }
}

3.总结:
- 数字签名就是发送方的私钥对原始数据进行签名
 - 只有用发送方公钥才能通过签名验证
* 防止伪造发送方
* 防止抵赖发送过信息
* 防止信息在传输过程中被修改 - 常用算法:MD5withRSA/SHA1withRSA/SHA256widthRSA
 
廖雪峰Java10加密与安全-5签名算法-1RSA签名算法的更多相关文章
- 廖雪峰Java10加密与安全-5签名算法-2DSA签名算法
		
DSA DSA:Digital Signature Algorithm,使用EIGamal数字签名算法,和RSA数字签名相比,DSA更快. DSA只能配合SHA使用: SHA1withDSA SHA2 ...
 - 廖雪峰Java10加密与安全-6数字证书-1数字证书
		
数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改
 - 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
		
1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...
 - 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法
		
1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...
 - 廖雪峰Java10加密与安全-4加密算法-2口令加密算法
		
对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...
 - 廖雪峰Java10加密与安全-4加密算法-1对称加密算法
		
1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...
 - 廖雪峰Java10加密与安全-3摘要算法-5Hmac
		
1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...
 - 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle
		
1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...
 - 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念
		
数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...
 
随机推荐
- Java Collection - 遍历map的几种方式
			
作者:zhaoguhong(赵孤鸿) 出处:http://www.cnblogs.com/zhaoguhong/ 本文版权归作者和博客园共有,转载请注明出处 ---------------- 总结 如 ...
 - Photoshop基本操作
			
PS 工具是我们使用频率比较高的软件之一, 我们学习PS目的不是为了设计海报做电商和UI的,而是要求: 会简单的抠图 会简单的修改PSD效果图 熟练的切图 能和网站美工美眉有共同话题..... Pho ...
 - 阿里云SaaS加速器“宜搭”发布宜搭Plus提升6倍研发效率
			
9月26日,在杭州云栖大会上,阿里云SaaS加速器的“底座”——“宜搭”正式发布“宜搭Plus”低代码开发平台.开发复杂企业业务系统所需要的领域数据模型.逻辑&服务编排.专业UI页面设计等,都 ...
 - axios HTTP 400后,error没有详细信息
			
参考网址:axios怎么获取到error中的状态值,具体信息 error.response
 - 关于python3字符串中引号格式的看法,‘’,“”
			
关于字符串中引号格式的看法 在python3中,字符串统一使用: ' ' 或 " " 来表示,两者没有什么区别. 但是在使用的过程中,可以注意一下使用的方式,可以提高编程 ...
 - JS之缓冲动画
			
原素材 main.html <!DOCTYPE html> <html lang="en"> <head> <link href=&quo ...
 - 第二天:数值与字符串、列表list
			
数值 1. 声明变量 age = 20 f = 3.14 #浮点型 f = 0.3 f = .3 2.表达式 主要是做一些简单的加减乘除运算,直接出结果 1.1 + 2.2 2.2 + 3.0 3.1 ...
 - <scrapy爬虫>scrapy命令行操作
			
1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...
 - Searching the String ZOJ - 3228 AC自动机查询升级版
			
题意:先给你一个不超过1000000长度的大串s:接下来输入一个n代表接下来输入的小串个数,小串长度不超过6. 小串分两种类型0和1类型. 0类型表示小串在大串中的最大匹配个数就是常规的AC自动机的做 ...
 - 由Toolbar造成的ListView最后一项显示不全
			
懒得写了==附上参考博文 Android GirdView/Listview 最后一行显示不完整 - sex_34的专栏 - CSDN博客