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签名算法的更多相关文章

  1. 廖雪峰Java10加密与安全-5签名算法-2DSA签名算法

    DSA DSA:Digital Signature Algorithm,使用EIGamal数字签名算法,和RSA数字签名相比,DSA更快. DSA只能配合SHA使用: SHA1withDSA SHA2 ...

  2. 廖雪峰Java10加密与安全-6数字证书-1数字证书

    数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改

  3. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法

    1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...

  4. 廖雪峰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 ...

  5. 廖雪峰Java10加密与安全-4加密算法-2口令加密算法

    对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...

  6. 廖雪峰Java10加密与安全-4加密算法-1对称加密算法

    1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...

  7. 廖雪峰Java10加密与安全-3摘要算法-5Hmac

    1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...

  8. 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle

    1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...

  9. 廖雪峰Java10加密与安全-1数据安全-1加密与安全概念

    数据安全 防窃听 防篡改 防伪造 古代加密方式: 移位密码:HELLO =>IFMMP 替代密码:HELLO=>p12,5,3 现代加密方式: 建立在严格的数学理论基础上 密码学逐渐发展成 ...

随机推荐

  1. Java 基础 - 原生类型

    更详细的说明,请参考: Java 原生类型与包装器类型深度剖析,https://blog.csdn.net/justloveyou_/article/details/52651211 一. 原生类型与 ...

  2. js代码触发事件

    /*** * 需要触发谁的点击事件 * @param how_id 节点的id 如:<input id='test'/> 则how_id=test * @param how_this 这个 ...

  3. kubernetes istio之流量管理

    1.部署 Bookinfo 应用 要在 Istio 中运行这一应用,无需对应用自身做出任何改变.我们只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar ...

  4. EXCEL函数常用技巧浅析

    EXCEL函数常用技巧浅析 EXCEL函数是一门趣味性非常大的游戏,此贴内容基本上为总结前人经验而来.废话不多说,我们现在走入正题. 一:判断数值奇偶性 1.1  ISODD(number) 判断一个 ...

  5. idae for mac部分背景色修改收集

    文章目录 所有字体默认颜色 终端背景色 行数line number背景色 line number颜色 编码区背景色 光标所在行背景色 未被使用的变量.方法或者类 控制台相关 选中文字的背景色 选中和未 ...

  6. python的__file__和__name__变量

    #现在的目录结构为 #现在想要在web2/bin.py中调用web3/main.py模块中的方法 from web3 import main main.foo() #在pycharm中执行 ##### ...

  7. PAT甲级——A1138 Postorder Traversa【25】

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  8. Selenium+Webdriver被检测识别出来的应对方案

    在写爬虫,面对很多js 加载的页面,很多人束手无策,更多的人喜欢用Senlenium+ Webdriver,古语有云:道高一尺魔高一丈.已淘宝为首,众多网站都针对 Selenium的js监测机制, 比 ...

  9. C# IP正则表达式

    public static bool IsValidIp(string strIn) { bool b = Regex.IsMatch(strIn, @"^[0-9]{1,3}\.[0-9] ...

  10. 测试环境添加spark parcel 2.1步骤

    1.先到http://archive.cloudera.com/spark2/parcels/2.1.0.cloudera1/ 下载需要的文件比如我linux版本需要是6的 hadoop6需要下载这些 ...