数字证书及其简单数字签名的实现

2024-06-10 00:58

本文主要是介绍数字证书及其简单数字签名的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

<!--[if !supportLists]-->1、<!--[endif]-->引导语/数字证书的应用

提到数字证书,大家首先可能想到这些。

 然而其实这些也是数字证书运用很广泛的地方,可以说,数字证书是整个信息时代网络安全及其有力的一种保障。

 我们可以简单的用一种很直接的方法查看我们的证书,比如右击一个exe类型的文件,打开文件的属性,然后你可以很清楚的看到数字证书这个选项。一般合格的企业都会给自己的软件颁发一个证书,从而保障自己软件的不可修改和盗用。试着想象一下,如果有人恶意的伪造了一个QQ软件,然后他通过此软件窃取了大量用户的信息,这造成的损失将是不可估量的。

 

 

 

按图示我们可以查看一个文件的证书信息

 

 

 

 

 
如果我们点击查看颁发者,如果你连了网络的话,会自动登录到根证书中心,美国的CA证书中心。
 

 

  当然,我们的每一台电脑也都拥有一个属于自己的证书,打开方式如图,由于我们的电脑是一个物理存在的实体,该证书其实就是本台电脑最高的权限拥有者,所以它不是由权威中心CA负责颁发的,而是由电脑服务商颁发的。

 首先是打开控制面板



 

 

 

 

 


当然也在邮箱服务,office 办公 ,等等很多的方面也是有数字证书签名的运用。

 

 

2、下面我们通过三个步骤来简单的看一下一个数字证书的颁发以及用它对jar包签名的简单实现过程

 

 

 

打开dos窗口,在窗口中输入keytool -genkey -alias Lanjie -keyalg RSA -keysize 1024 -keystroe Lanjie -validity 365 

 

其中:keytool 是密钥工具

     -genkey 是用于获取密钥

 -alias 是自己定义一个别名

 -keyalg是指定算法 此处指定的算法是RSA

     -keysize是指定密钥的长度

     -keystore 是指定密钥库的名字

 -validity 是指定密钥的有效时间

 

在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括

CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:

CN(Common Name 名字与姓氏)

OU(Organization Unit 组织单位名称)

O(Organization 组织名称)

L(Locality 城市或区域名称)

ST(State 州或省份名称)

C(Country 国家名称)

可以采用交互式让工具提示输入以上信息,也可以采用参数

-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"来自动创建。

这里我们使用手动输入。如图所示

 


我们可以用以下的指令查看证书库中的证书
 


 

 

 

 

 

 

 导出两个证书后,我们打开C盘的用户目录,就能在下面看到一个导出来的证书文件。这和我们在前面看到的证书都是一样的,只是这两条证书不是由CA中心颁发的,而是自己给自己颁发的。我们打开证书后,提示该证书是不可信赖的,我们打开后按图示把证书安装后再次打开的时候,就不会提示该证书存在安全风险。同样把另一个个证书都进行这样的安装。

 



 下面我们打开Eclipse ,用java代码实现数字证书的的颁发过程,其实颁发的过程就是一个权威的机构的数字证书给自己的数字证书签名的过程,这个过程其实是用两个证书共同生成一个新证书的过程。下面我们用java代码实现。

FileInputStream fis=new FileInputStream(name);//JKS为证书库的类型KeyStore ks= KeyStore.getInstance("JKS");ks.load(fis, storepass);//从证书库中读出签发者CA证书//读出一个CA证书Certificate cf=ks.getCertificate(alias);//根据别名和证书密码读出CA证书的私钥PrivateKey privatekey=(PrivateKey)ks.getKey(alias, cakeypass);fis.close();//提取证书的编码byte[] encod_first = cf.getEncoded();//根据证书的编码创建X509Certlmpl对象X509CertImpl xcp_first=new X509CertImpl(encod_first);//根据上面的对象获得X509Certinfo类型的对象//该对象封装了证书的全部内容X509CertInfo cinfo_first = (X509CertInfo)xcp_first.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);//然后获得X500Name类型的签发者信息X500Name issuer = (X500Name)cinfo_first.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);

 

详细的代码在附件里面请读者自行下载,每段代码的作用和功能都有比较详细的注释,这里不在赘述。我们按上面的方法导出证书后。安装证后显示如下

 

 

 

 

下面我们用自己写一个简单的Applet小程序,Applet小程序在网页里面运行时如果没有签名,一般的浏览器是不会支持打开的,总是会出现很多的安全性问题和提示。当然有的时候系统还有浏览器的问题总是会造成Applet小程序无法运行,不过我们可以看在网页上看到这个网页已经被签名了,具体查看过程我们待会再说。下面是Applet小程序的书写,Applet小程序同样在附件中,这里选的的是一个小简单的闹钟小程序。我们在Eclipse里面运行Applet小程序后,可以采用多种两种方式对aApplet小程序进行打包,一种最常见的打包方式就是用Eclipse进行打包,打开file-选项,然后是Export,接着打开java,就会看到jar包的选项,如果Eclipse的版本过低的话,没有Runnable JAR file这个选项。不过我们也可以打包出jar包这个选项,因为不管这个程序是否运行,都不影响我们测试签名的过程,

 

当然我们也可以采用dos窗口里面的dos语句来打包一个jar文件,将dos窗口的路径跳到要打开的包的目录 打包过程如下:jar cvf  XX.jar  XX.class     。

 

打包结束后,我们用签名后的证书给jar包签名 签名的过程很简单。签名后的jar包是用于防止抵赖的保障,这里不涉及防止抵赖。我们可用原来的  证书签名 jarsigner -keystore lanjie ClockApplet.jar lanjie。这样一个签名结束。签名的目的是使得网页对本地文件产生信赖,从而可以打开本地文件,不过有时候由于系统以及浏览器的问题,网页的applet有时候不能正常的显示,不过这不影响我们判断签名是否成功。

 

 下面我们写一个简单的html文件。此文件用于存放applet文件。

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

     

<html>
<body><applet codebase="." code="Clock.class" name="ClockApplet" 
archive="ClockApplet.jar"width="320" height="240"></applet></body>
</html>

 

 

接着我们要做的事就是用浏览器打开html文,首先我们将看到。

 



 这是浏览器为了我们电脑自身的安全所做的一个安全保障。如果applet没有问题并且用户以及浏览器权限允许的情况下,我们点击允许后可以看到做好的applet在网页中运行。这里我们点击详细信息后就可以看到如下。

 



 我们可以看到这个html里面的jar包已经被lanjie这个数字证书签名了!它里面包含了各种签名的信息。不用质疑,签名过程已经实现了。大笑尴尬

 

这篇关于数字证书及其简单数字签名的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046803

相关文章

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符