密码学专题 文件编码格式

  • OpenSSL中虽然使用PEM作为基本的文件编码格式,但是,由于不同的对象其封装的标准格式不太一样,所以经常会导致读者产生迷惑。此外,OpenSSL也支持DER编码和过时的Netscape编码格式(NET)
  • OpenSSL的编码是基于ASN.1标准的,ASN.1全称为AbstractSyntaxNotationOne,是一种描述数字对象的方法和标准。ASN.1是一种结构化的数字对象描述语言,它包括了两部分,分别为数据描述语言(ISO8824)和数据编码规则(ISO8825)
  • ASN.1的数据描述语言标准允许用户自定义基本数据类型,并可以通过简单的数据类型组成更复杂的数据类型。比如一个复杂的数据对象,如X.509证书,就是在其他一些数据类型上定义的,而其他数据类型又是在更基本的数据类型上建立的,直到回溯到定义的最基本的数据类型。
  • ASN.1提供了多种数据编码方法,包括了BER,DER,PER和XER等。这些编码方法规定了将数字对象转换成应用程序能够处理、保存和网络传输的二进制编码形式的一组规则。目前经常被采用的是BER(BasicEncodeRules)编码,但是BER编码具有编码不唯一的性质,也就是说,一个相同的对象通过BER编码可能会产生几种不同的编码数据。所以,在OpenSSL和其他密码学相关软件中经常使用BER的一个子集DER(DistinguishedEncodingRules)。对于每一个ASN.1对象,使用DER编码得出的二进制编码数据是唯一的
  • PEM编码全称是PrivacyEnhancedMail,是一种保密邮件的编码标准。通常来说,对信息的编码过程基本如下。
  • 1 信息转换为ASCI码或其他编码方式,比如采用DER编码。
  • 2 使用对称加密算法加密经过编码的信息。
  • 3 使用BASE64对加密后的信息进行编码。
  • 4 使用一些头定义对信息进行封装,主要包含了进行正确解码需要的信息,头定义的格式形式如下:
  • Proc_Type,4:ENCRYPTED  
  • DEK-Info:cipher-name,ivec
  • 其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRYPTED(信息已经加密和签名),MIC-ONLY(信息经过数字签名但没有加密),MIC-CLEAR(信息经过数字签名但是没有加密,也没有进行编码,可使用非PEM格式阅读),以及CLEAR;第二个头信息标注了加密的算法及对称加密块算法使用的初始向量。
  • 在这些信息的前面加上如下形式头标注信息:—BEGIN PRIVACY-ENHANCED MESSAGE—
  • 在这些信息的后面加上如下形式尾标注信息:—END PRIVACY-ENHANCED MESSAGE—
  • OpenSSL的PEM编码基本上是基于DER编码之上的,也就是说,它在上述第一步采用的是DER编码,所以,从本质上来说,OpenSSL的PEM编码就是在DER编码基础上进行BASE64编码,然后添加一些头尾信息组成的。读者可以做一个实验,将OpenSSL签发的PEM证书文件转换成DER编码(二进制),导入到WindowsIE中,然后再从WindowsIE以BASE64编码的DER格式导出到另一个文件中,比较原始的PEM格式文件跟新导出的DER文件,读者会发现其实是一样的。事实上,OpenSSL也是将以这种方式导出的文件当成是PEM格式的文件进行解码的。需要说明的是,OpenSSL的指令有对特定类型的文件(比如X.509证书文件)进行PEM和DER格式转换的方法。由于OpenSSL里面的DER格式是指没有经过BASE64编码的DER格式,所以事实上就是在二进制的DER和BASE64编码的DER(PEM)格式之间进行转换。
  • OpenSSL还支持一种老式的Netscape编码格式(NET),由于这种格式现在基本上废弃不用了,这里不再作更多的介绍。

证书编码

X.509证书

  • 数据编码格式提供了封装数据的基本方法,但是,对于具体的数据对象,比如证书,根据其包含的内容的不同,还有更具体的表达方式。
  • 目前总的来说有三种常用的证书编码格式:X.509证书、PKCS#12证书和PKCS#7证书。X.509证书是最经常使用的证书,它仅包含了公钥信息而没有私钥信息,是可以公开进行发布的,所以X.509证书对象一般都不需要加密。
  • 一个OpenSSL签发的经过PEM编码的X509证书看起来通常有如下的格式:

 

  • 上述信息中,在“—BEGINCERTIFICATE—”和“—ENDCERTIFICATE—”之间就是PEM编码的X.509证书。PEM编码的数据信息总是包含在一对头和尾组成的标识符之间,对于X.509证书来说,
  • 除了上述形式的头尾格式,还可能出现以下两种不同的标识符: 

  • 以上三种形式,OpenSSL都可以进行正确的处理和解码。
  • 读者可能还会在OpenSSL实际签发的证书文件中最前面发现很多可读的证书明文解释,事实上,这些只是增加了证书文件的可读性,并不代表真正的数据。在其他软件中,比如Windows软件,可能并不支持这些额外的明文信息,所以,先要将“—BEGINCERTIFICATE—”之前的所有可读信息去掉。删除这些信息的方法很多,最简单的是手动删除。
  • 此外,也可以使用x509指令,进行PEM到PEM的证书格式转换,就可以去除明文可读信息。
  • 在Windows平台,X.509证书文件的后缀名经常是der,cer或者crt,都是可以被自动识别的。当然,对于OpenSSL来说,后缀名是没有实际意义的。
  • OpenSSL的指令x509提供了对X.509证书进行格式转换的方法,可以在DER,PEM和NET三种格式之间进行转换。 

PKCS#12证书

  • PKCS#12证书不同于X.509证书,它可以包含一个或多个证书,并且还可以包含证书对应的私钥。OpenSSL对PKCS#12证书提供了支持,并且提供了专门用于处理PKCS#12证书的指令pkcs12。
  • pkcs12指令可以将普通的X.509证书和私钥封装成PKCS#12证书,也可以将PKCS#12证书转换成X.509证书,并提取出相应的私钥。
  • 一般来说,PKCS#12证书的私钥是经过加密的,密钥由用户提供的口令产生。所以,无论在使用pkcs12指令编码或者解码PKCS#12证书的时候,一般都会要求用户输入密钥口令。
  • PKCS#12证书文件在Windows平台和Mozila中支持的后缀名是p12或者pfx。如果要在IE或者Mozila中正确使用自己的证书,那么一般来说都要求转换成包含公钥和私钥的PKCS#12证书导入到相关软件中。

PKCS#7

  • PKCS#7可以封装一个或多个X.509证书或者PKCS#6证书(PKCS#6是一种证书格式,但是并不经常使用),并且可以包含CRL信息。PKCS#7证书也不包含私钥信息,但是跟X.509证书不同的是,它可以包含多个证书,这就使得PKCS#7可以将验证证书需要的整个证书链上的证书都包含进来,从而方便证书的发布和正确使用。
  • OpenSSL提供了对PKCS#7格式文件的支持,并提供了crl2pkcs7和pkcs7两个指令来生成和处理PKCS#7文件。可以使用他们在X.509证书和PKCS#7证书之间进行转换和处理。
  • PKCS#7文件在Windows平台的合法后缀名是p7b。

密钥编码

  • OpenSSL有多种形式的密钥,很多情况下,需要把这些密钥保存下来。OpenSSL提供了PEM和DER两种编码方式对这些要保存的密钥进行编码,而且都提供了相关指令可以使用户在这两种格式之间进行转换
  • DER编码存储的密钥文件是不可读的,如果你乐意用文本编辑器打开它,那么将看到一些难以理解的符号,然而这很正常,因为这是一个二进制编码的文件。
  • PEM则不一样,它要友好得多,因为PEM经过BASE64编码。用文本编辑器打开PEM编码的密钥文件,可以看到跟证书类似,它们真正的编码都包含在类似于:
  • ——BEGIN XXXXX——
  • ——END XXXXX——
  • 这样一对符号内,使用某些OpenSSL指令的一些选项后,你也许会在这对符号之前看到一些明文的信息,这些信息是编码内容的明文解释,并不是实际的数据,你要关注和使用的就是上述特殊符号内包含的内容。
  • 密钥总的来说有两种,一种是可以公开的(比如公开密钥对的公钥),一种是不能公开的(比如公开密钥对的私钥)。那么,反映在编码上,有的密钥文件就会需要加密,有的就不需要加密。
  • 一个经过加密的PEM编码密钥文件在上述的符号内会增加一些头信息,这就是在前面介绍的PEM编码的头信息,这时候就派上用场了。这些头信息主要是为密钥解密的时候提供有用的信息,包括标记密钥加密状态、使用的加密算法及初始向量(对于块加密算法来说)
  • 下面是一个经过加密的RSA私钥的PEM编码文件的例子:

 

  • 可以看到,上述的PEM编码的是RSA私钥(RSAPRIVATEKEY),该密钥经过了加密(ENCRYPTED),使用的加密算法是3DES的CBC方式(DES-EDE3-CBC),使用的IV向量是“86B0167E005535D2”。
  • OpenSSL的指令提供了对密钥加密的功能,并提供了多种可选的加密算法,这些算法都是对称加密算法,比如DES和DES3等。OpenSSL的指令通常使用要求输入口令的方式来生成用来加密密钥数据的密钥,这里的口令并非直接用来作为加密的密钥,而是根据这个口令使用一系列HASH操作来生成一个用于加密密钥数据的密钥。在读取这类加密的密钥文件的时候,OpenSSL的指令同样会要求你输入用于解密的口令,当然,这个口令跟你加密密钥时输入的口令应该是一致的。
  • OpenSSL对某些类型的密钥也提供了一些标准的封装格式,如PKCS#8和PKCS#12格式。PKCS#8是用于封装需要保密的密钥的规范格式,OpenSSL提供了pkcs8的指令来处理这类格式的文件。事实上,PKCS#12对密钥的封装就是采用了PKCS#8的格式。OpenSSL有各种各样的密钥类型需要采用上述方法进行编码,比如RSA的公钥和私钥、DSA的公钥和私钥、DH密钥参数,等等,它们的形式基本上是一样的。
  • 当然,无论采用什么加密方式对密钥进行加密保存,以文件形式存储的密钥其安全性总是不可靠的,更值得信赖和推荐的方式是将密钥存储在不可导出的密钥设备中,比如USBKey、SmartCard和加密机等硬件设备中,这些设备内部能够完成加密操作,所以不需要将密钥取出,这增加了密钥的安全性。

 其他编码

  • 证书吊销列表(CRL)是用户验证证书的重要参考资料,它主要包含了无效的证书列表,告诉用户哪些证书是已经吊销或无效的。当然,如果没有CRL,或许你可以选择另一种验证方式,那就是使用在线证书服务协议(OCSP)。但不幸的是,OCSP并不总是能够使用,比如你的网络有时候可能不能接通OCSP服务器,那么你就要自行解决这个问题了。
  • CRL是一种相对方便和独立的解决方案,只要获取了CA中心提供的在有效期内的CRL,基本上就能对证书的有效性进行验证。OpenSSL提供CRL文件的生成、解释及格式转换等。
  • PEM格式编码的CRL一般包含在如下的一对符号内:
  • ——BEGIN X.509 CRL——
  • ——END X.509 CRL——
  • 当然,还可以使用DER格式保存CRL。OpenSSL的指令提供了在PEM和DER之间对CRL进行格式转换的功能。此外,你也可以把CRL和证书一起封装成PKCS#7格式,使用的指令是crl2pkcs7。
  • OpenSSL还包含了其他一些可以使用PEM编码的有趣对象,当然,你可能永远不需要使用这些对象。SSL协议的Session对象是其中之一,它可以被编码成PEM格式,然后你可以使用OpenSSL的指令将它解释成可以查看的明文。Session对象处理的指令是ses_id。
  • OpenSSL还支持对Netscape证书序列格式(NSEQ)的PEM编码和解释,相应的指令是nseq。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts 折线图 设置y轴最小刻度_【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统...

作者丨夙言来源丨前端大牛爱好者(Web-2017)https://segmentfault.com/a/1190000018993981本文章篇幅略长,内容有点多,大佬可根据目录选择性查阅,新人可一步步来阅读。1、 前言1.1 业务场景突然接到产品说要做一个数据监控的系统。有线图、柱状…

密码学专题 文本数据库

应用概述 文本数据库是跟OpenSSL的CA应用程序紧密结合在一起的,它以文本的方式记录CA已经签发的证书的状态和摘要信息。这些状态信息可以用于跟证书库相关的一些操作,比如使用ca指令生成CRL主要就是读取这个文本数据库的信息作为参考。文本数据库就是普…

Python学习13 异常处理机制

概括 常见的异常 异常处理机制 可以多个异常放在元组里面 一旦产生异常,try后面的语句不会继续执行,会做异常处理 异常使用场景1 close应该放在finally中 异常使用场景2 finally关键字 会执行except后面的,报错

java 布隆过滤器_牛逼哄哄的布隆过滤器,到底有什么用?

Java技术栈www.javastack.cn打开网站看更多优质文章作者:CodeBear的园子www.cnblogs.com/CodeBear/p/10911177.html本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移…

Java web后端6 java Bean EL表达式

EL表达式和JSTL概述 java Bean规范 java中成员变量使用类Integer private Integer count; java Bean的创建 创建java Bean: BookTest.java package com.example.elandjstl.bean;public class BookTest {//java中成员变量使用类Integerprivate Integer count;private Boolean…

python根须系统斜杠_深入浅出Python中的os模块

「Author:Runsen」当初学Python的时候,把一些标准库和第三方开源库学的七零八落,不成系统,正好趁这个机会来系统的整理一下,先从Python常用的标准库os开始吧。osOS模块简单的来说它是一个Python的系统编程的操作模块&a…

Java web后端7JSTL

概括 下载jstl的jar包 官网&#xff1a;https://mvnrepository.com/ 网址1&#xff1a;https://search.maven.org/ 在pomxml中插入依赖&#xff1a; <dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1…

Python学习14 模块和包

模块 公共类、函数都可以放在独立的文件中&#xff0c;这样其他多个程序都可以使用&#xff0c;而不必把这些公共性的类、函数等在每个程序中复制一份&#xff0c;这样独立的文件就叫做模块&#xff0c;它们的扩展名为.py 标准库中的模块 使用help查看模块 代码&#xff1a; …

python语句分为_python以什么划分语句块

语句块是在条件为真&#xff08;条件语句&#xff09;时执行或者执行多次&#xff08;循环语句&#xff09;的一组语句&#xff1b;在代码前放置空格来缩进语句即可创建语句块&#xff0c;语句块中的每行必须是同样的缩进量&#xff1b;&#xff08;推荐学习&#xff1a;Python…

Python学习15 正则表达式1

网址 正则表达式测试网址&#xff1a;https://regex101.com/ 概述 正则表达式&#xff1a; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"…

STL源码剖析 空间配置器 查漏补缺

ptrdiff_t含义 减去两个指针的结果的带符号整数类型ptrdiff_t (Type support) - C 中文开发手册 - 开发者手册 - 云社区 - 腾讯云 std::set_new_handler&#xff08;&#xff09;函数的理解 关于set_new_handler的理解_wck0617-CSDN博客new分配内存的时候 如果分配的空间不…

Python学习16 正则表达式2 re模块

re 模块 re 模块&#xff1a; Python的 re 模块实现了正则表达式处理的功能。 导入re模块后&#xff0c;使用findall、search函数可以进行匹配 查找&#xff1a;match和search 多个匹配上的&#xff0c;也只会返回第一个匹配上的 re.match()&#xff1a; 需要特别注意的是&…

STL源码剖析 内存基本处理工具 初始化空间的五个函数

初始化空间的五个函数构造函数 construct()析构函数 destroy()剩余三个底层函数 和 高层函数之间的对应关系如下uninitialized_copy() 对应 copy()uninitialized_fill() 对应 fill()uninitialized_fill_n() 对应 fill_n()使用<memory>使用上述三个底层函数 uninitiali…

单基因gsea_筛到5分的核心基因以后你可以怎么做?

这一次我们从一些已经发表的文章拆解&#xff0c;我们来看看&#xff0c;你找到了一个核心基因以后&#xff0c;你可以怎么做呢&#xff1f;我们就不说那么多废话了&#xff0c;直接用几篇文章的解读来带着大家领会一下如何去进行下一步的分析。Case1&#xff1a;预后标志物免疫…

STL源码剖析 迭代器的概念和traits编程技法

迭代器&#xff1a;依序巡防某个聚合物(容器)所含的各个元素&#xff0c;但是不需要暴露这个聚合物的内部表述方式核心思想&#xff1a;将容器和算法分开&#xff0c;彼此独立设计容器和算法的泛型化&#xff0c;均可以使用模板&#xff0c;使用迭代器连接容器和算法例子 templ…

STL源码剖析 5中迭代器型别

最常使用的5种迭代器的型别 为 value_type、difference_type、pointer、reference、iterator_category。如果想要自己开发的容器和STL进行适配&#xff0c;就需要定义上述5种类型 iteraor_traits 必须针对传入的型别为 pointer 或者 pointer-to-const设计偏特化版本 template &…

加载tf模型 正确率很低_深度学习模型训练全流程!

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习&#xff0c;不错过Datawhale干货 作者&#xff1a;黄星源、奉现&#xff0c;Datawhale优秀学习者本文从构建数据验证集、模型训练、模型加载和模型调参四个部分对深度学习中模型训练的全流程进行讲解。一个成…

Python学习17 Turtle库绘图

学习网址&#xff1a;https://docs.python.org/zh-cn/3/library/turtle.html Turtle库 Turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff08;画布中心&#xff09;&#xff0c;(0,0)位置开…

android ros 节点编写_嵌入式的我们为什么要学ROS

前言本来是要写一篇STM32移植ROS的一个小lib库&#xff0c;ROS一般都是需要跑在Linux上的&#xff0c;STM32使用就是当成一个ROS通讯的小节点&#xff0c;但是写文章时间不够&#xff0c;所以就简单做一篇ROS的介绍文章&#xff0c;分享给嵌入式的小伙伴们。ROS现在在机器人领域…

STL源码剖析 __type_traits

traits编程 弥补了C本身的不足STL只对迭代器进行规范制定出了iterator_traits&#xff0c;SGI在此基础上进一步扩展&#xff0c;产生了__type_traits双下划线的含义是这个是SGI内部使用的东西&#xff0c;不属于STL标准iterator_traits 负责萃取迭代器的特性__type_traits负责萃…