在ISO 7498-2:1989文档中,定义了安全服务的类型,安全服务包括五种类型:
鉴别(Authentication):保证通信的真实性;
访问控制(Access Control):防止网络资源被非授权地访问;
数据保密性(Data Confidentiality):对数据进行加密;
数据完整性(Data Integrity):防止数据被篡改或重放;
不可否认性(No-repudiation):防止发送方抵赖所传输的信息。
使用百度,可以轻松获得ISO 7498-2:1989文档,感兴趣的朋友可以自己学习。
2、数字签名的概念签名这个词,我们日常生活中使用得比较多,一份文件、单据或合同,我们如果认可其中的条款,就可以签署我们的名字。一般情况下,不同的人笔迹不同,通过签名可以防止签署人否认所签署的内容。
数字签名的英文是Digital Signature。数字签名,就是只有信息发送方才能产生的、别人无法伪造的数字串。
数字签名需要实现鉴别(认证数据来源)、数据完整性、不可否认性三项安全服务。
3、数字签名的原理假如我们是安全专家,要实现鉴别、数据完整性、不可否认这三项服务,我们可以这样来设计数字签名:
(1)使用消息摘要算法实现数据完整性;
(2)使用提供了公钥和私钥的算法,实现鉴别和不可否认两项服务。
实际上,数字签名也是这样实现的,下面就是数字签名的实现机制:
简单地说,数字签名,其实就是支持公钥和私钥的消息摘要算法。
此外,上图只是描述了数字签名算法本身的实现。实际商用中,为了保证发送中的数据内容不被其他人获取到,甲方在发送数据前,会使用乙方的公钥对发送的数据加密,乙方收到数据后会首先用自己的私钥对加密数据进行解密。
4、常用的数字签名算法业界比较常用的数字签名算法有三种:RSA、DSA、ECDSA。
RSA前面讲解过,是一种非对称加密算法。其实RSA也可以用作数字签名算法。
DSA算法是在RSA之后提出的数字签名算法,和RSA相比,DSA只能用于数字签名,不能用于数据的加密和解密。
ECDSA算法则是ECC算法和DSA算法的结合,相比来说,它有计算快、强度高、签名短的优点。
5、使用Java语言实现数字签名功能5.1 JDK和Bouncy Castle提供的数字签名算法在JDK中,提供了下面的签名算法:
MD2WithRSA
MD5WithRSA
SHA1WithRSA
SHA1WithDSA
在Bouncy Castle中还提供了下面的签名算法:
SHA224WithRSA
SHA256WithRSA
SHA384WithRSA
SHA512WithRSA
SHA224WithDSA
SHA256WithDSA
SHA384WithDSA
SHA512WithDSA
SHA1WithECDSA
SHA224WithECDSA
SHA256WithECDSA
SHA384WithECDSA
SHA512WithECDSA
这些算法,从名称就可以看出是RSA、DSA还是ECDSA,以及基于的消息摘要算法。
下面我们使用JDK提供的MD5WithRSA算法,编写一个实验程序。
5.2 使用IDEA建立project_ds工程,然后在project_ds工程下建立digital_signature模块:5.3 创建一个Sender类创建Sender类的对象实例时,提供原始数据信息和私钥,Sender对象则生成签名。
Sender类的代码如下:
package com.flying.digital_signature;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class Sender {
private RSAPrivateKey rsaPrivateKey;
private byte[] originBytes;
public Sender(RSAPrivateKey rsaPrivateKey, byte[] originBytes){
this.rsaPrivateKey = rsaPrivateKey;
this.originBytes = originBytes;
}
public byte[] getSignature(){
byte[] signatureBytes = null;
try {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("MD5WithRSA");
signature.initSign(privateKey);
signature.update(originBytes);
signatureBytes = signature.sign();
System.out.println("digital signature is : " Base64.getEncoder().encodeToString(signatureBytes));
}catch (Exception ex){
ex.printStackTrace();
}
return signatureBytes;
}
}
5.4 创建一个Receiver类
创建Receiver类的对象实例时,提供原始数据信息、公钥和签名,Receiver对象则验证签名。
Receiver类的代码如下:
package com.flying.digital_signature;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
public class Receiver {
private RSAPublicKey rsaPublicKey;
private byte[] originalBytes;
private byte[] signatureBytes;
public Receiver(RSAPublicKey rsaPublicKey, byte[] originalBytes, byte[] signatureBytes){
this.rsaPublicKey = rsaPublicKey;
this.originalBytes = originalBytes;
this.signatureBytes = signatureBytes;
}
public void checkSignature(){
try {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Signature signature = Signature.getInstance("MD5WithRSA");
signature.initVerify(publicKey);
signature.update(originalBytes);
System.out.println("Signature verify result: " signature.verify(signatureBytes));
}catch (Exception ex){
ex.printStackTrace();
}
}
}
5.5 修改main方法
在main方法中生成公钥、私钥和原始数据信息,并调用Sender和Receiver类的功能来测试数字签名。
main方法在DigitalSignatureApplication类中定义,DigitalSignatureApplication类的代码如下:
package com.flying.digital_signature;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
@SpringBootApplication
public class DigitalSignatureApplication {
public static void main(String[] args) {
SpringApplication.run(DigitalSignatureApplication.class, args);
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
byte[] originBytes = "abcdefghi".getBytes();
System.out.println("RSA public key is : " Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded()));
System.out.println("RSA private key is : " Base64.getEncoder().encodeToString(rsaPrivateKey.getEncoded()));
System.out.println("Original bytes is : " Base64.getEncoder().encodeToString(originBytes));
Sender sender = new Sender(rsaPrivateKey, originBytes);
byte[] signatureBytes = sender.getSignature();
Receiver receiver = new Receiver(rsaPublicKey, originBytes, signatureBytes);
receiver.checkSignature();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
5.6 这是程序某次运行的结果
RSA public key is : MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKB2iMFgDsOjPVi86JLkJaNxjQWinPU4ZOSqjtxUQWKtTo2ckNvi9gVmEQTYLinkjJ VkD30r2QSM3YeML5jjbUCAwEAAQ==
RSA private key is : MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEAoHaIwWAOw6M9WLzokuQlo3GNBaKc9Thk5KqO3FRBYq1OjZyQ2 L2BWYRBNguKeSMn5WQPfSvZBIzdh4wvmONtQIDAQABAkBJZ3AP5f1bCaXanjBWYf/F0QAN/ GFXBLreAp6SCDRHnM6cJoKA1un87Wijr3MIFylWgNtSWcGBj8gxE6pmLSBAiEA61s0c7UfV1GRjQ7Txb0GrUBssT8cBnDXs6Jgd4NFBekCIQCuiaSQ6xTc8NaenhigE0G9B7tB6uRfc3lNdI2Iv0ZN7QIhAIMye2HI5KizUrTUQB8piTBJCo4fxQqeGtALQ0U8Ct0JAiEAgA9DrISfUSBwB/9th/25DQ3gKhRDLXmXNepfckcNOV0CIQDT5OHxJU 6yhViiqdoazEP63cIsg4NuunJrBRytwIEsA==
Original bytes is : YWJjZGVmZ2hp
digital signature is : Ir1PMMzSEeYq7qgH9KtClBRVPifKxSq9cdYSrL GX6ztwJztY0t5GCnAo7pHg GOQdSnHoXXXeZEv4FxK2BMEA==
Signature verify result: true
可以看到,程序运行成功。
整个程序只有三个类,上面的代码是完整的,如果你感兴趣,可以自己在电脑上调试运行。
推荐一本不错的Java书籍,既可以作为入门的读物,也可以作为日常工作的技术参考,希望读者喜欢:
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved