数字形象记忆法,数字编码记忆法 训练,数字签名的概念入门和Java代码实现

极简大道 极简大道 2023-11-05 记忆方法 阅读: 104
摘要:



1、安全服务的类型

在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中,提供了下面的签名算法:

MD2WithRSAMD5WithRSA
SHA1WithRSA
SHA1WithDSA

在Bouncy Castle中还提供了下面的签名算法:

SHA224WithRSASHA256WithRSA
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;

@SpringBootApplicationpublic 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书籍,既可以作为入门的读物,也可以作为日常工作的技术参考,希望读者喜欢:

其他相关

看到4的数字你会联想到什么,快速记忆数字的方法和技巧,快速记忆-抽象联想之数字记忆

作者: 极简大道 时间:2023-12-29 阅读: 114
@速读速记发现在我们平时的学习和生活中, 记忆数字却必不可少、比如历史年代、银行密码、车牌号、门牌号、身份证号、电话号码等, 那如何记忆抽象且较长的数字呢?为了解决记忆数字问题,@速读速记觉得有必要把数字编码,也就是对每个数字再增加一些代码像编程似的,这样在应用时就可随着记忆材料的不同,而选择最贴近记忆材料的、便于联想,缩短时间,提高效率。...
1-100数字记忆编码图,1到20数字卡片图片,数字人文本熟读之美! 让数字人更美!#拍摄准备工作

1-100数字记忆编码图,1到20数字卡片图片,数字人文本熟读之美! 让数字人更美!#拍摄准备工作

作者: 极简大道 时间:2023-12-28 阅读: 400
数字人拍摄流程具体如下:文本练习中,提供了简单、易用的反面案例,疯狂卡壳。今天主要聚焦于文本阅读拍摄数字人形象。1.创意生成,创业性化的短视频。需要被拍摄者对着摄像机默写一段时间文本,便于后期数字人形象训练。默读文本,正面案例,阅读顺畅,无需太长时间。短时间内单击保证不读错字、不停顿。2.开始录制,派度数字人的直播系统是通过派度数字人的录制系统发送的,感情丰富饱满、平稳利落。当被拍摄者持续出错时,为提高效率,应继续回到最初准备工作。3.顺畅,通过智能问答系统录制前仍在反复背诵。段落记住稿件,顺畅,也可通过输入关键词形式生成文案。...
艾宾浩斯记忆法,1-100数字记忆编码图,只需两步生成自己的数字人形象!

艾宾浩斯记忆法,1-100数字记忆编码图,只需两步生成自己的数字人形象!

作者: 极简大道 时间:2023-12-28 阅读: 125
数字人是什么?重新下一个定义:"把人数字化,以行人的职责“它是用AI技术根据你的真人形象克隆出一个数字人,跟真人的相似度可以达到100%以上的,像你的动作、表情还有声音,都是可以被克隆出来。克隆出来一个虚拟形象,代替你进行拍视频或者是直播,就不需要真人了。...

数字形象化图片,艾宾浩斯记忆法,少年记|高效记忆大课堂-数字编码法浅析

作者: 极简大道 时间:2023-12-28 阅读: 107
数字编码法是按照实际记忆的需要,列出若干数量的数,将这些数分别用形象的编码词来代表并准确熟练地记住这些编码词与数的一一对应关系,在实际记忆过程中,通过将记忆内容的形象与这些编码词的形象建立牢固、不易忘记的“捆绑”(建立在想象基础上的联想关联),来将记忆内容按数量与顺序依次“捆绑”在数上,依靠数的序数(顺序)记住记忆内容的数量,依靠编码词与记忆内容的形象“捆绑”记住记忆内容,从而实现对记忆内容的准确记忆的一种记忆方法。...

中文密码法记忆英语单词,世界著名密码表,记不住密码?学会这些就不怕

作者: 极简大道 时间:2023-11-06 阅读: 169
密码的重要性不言而喻,大家通常会发生两种情况,第一种是被盗,第二种是记不住。好巧的是,小编是一个忘性极大的人,所以不得已必须找到一个记录密码的方法,这样可以确保安全无虞。同时,电脑手机的使用习惯也非常重要,小编今天就跟大家分享一下。...

年度爆文