1 数据编码格式

openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释

ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语言,包括两部分,数据描述语言和数据编码规则,数据描述语言标准:语言标准允许用户自定义的基本数据类型,并可以通过简单的数据类型组成更复杂的数据类型。数据编码规则:这些编码方法规定了将数字对象转换成应用程序能够处理、保存、传输的二进制形式的一组规则。标准ASN.1编码规则有规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。

没看懂?好吧,我也没看懂。经过搜索无数资料后,现把自己的理解说一下,有不对的地方请大牛指正

我们知道在计算机语言中有很多的数据结构,有列表、集合、数组等等。但对应用程序特别是网络来说,这些数据结构都是二进制的数据流,那么如何把这些不同的数据结构变成数据流,又能让其他应用能够识别呢。这就需要一个标准,也就是我们说的ans.1,大家都遵守这个标准,自然可以和平共处。OK,这个标准到底是什么玩意?

这个问题一会再来回答。现在我们想想如何把一个二叉树中的数据以流的形式发出去,对于整型、字符串这些基本类型我们可以直接塞进数据流里,但对于这种复杂的结构,这种方法就不显示了,怎么办?我们引入一个数字对象的概念,把这些数据结构转化成一个数字对象,怎么转?这就用到了asn.1标准的第一部分--数据描述语言标准,这个标准定义了一些基本的数据类型,如果我们使用到复杂的数据结构,asn.1还允许通过简单数据类型组成复杂的数据类型(x.509)。

数字对象已经建立的,怎么把这个数据对象变成二进制流呢,这就需要用到ans.1的第二部分--编码规则,编码方法规定了将数字对象转换成应用程序能够处理、保存、传输的二进制形式的一组规则。

现在可以回答上面这个问题了,简单来说这个标准就是规定了把数据转化成数据对象,又规定数据对象编码为二进制流的方法。

openssl使用的是asn.1的der编码规则,保证每个asn.1对象使用der编码的出的二进制编码是唯一的。

openssl使用pem作为基本的文件编码格式,pem和der是什么关系,如下图所示,几种加密环节是可选的

从本质上来说,openssl是pem编码就是在der编码的技术上进行Base64编码,然后添加一些头尾信息组成,可以通过openssl指令对der和pem进行格式转换

2 证书编码格式

常见的证书编码格式有三种X.509证书,PKCS#12证书PKCS#7证书。

X.509证书:最常用的证书格式,它仅包含了公钥信息而没有私钥信息,一个openssl签发经过PEM编码的X.509证书看起来如下

-----BEGIN CERTIFICATE-----
XXX
-----END CERTIFICATE-----

中间部分就是经过PEM编码的X509证书。除了上述形式的头尾格式,还可能出现以下两种不同的标识符

-----BEGIN X. CERTIFICATE----
XXX
-----END X. CERTIFICATE-----
或者
-----BEGIN TRUSTED CERTIFICATE-----
-----END TRUSTED CERTIFICATE-----

X.509证书文件的后缀名经常是der,cer或者crt。openssl的指令x509提供了对X.509证书进行格式转换的方法。

PKCS#12证书:PKCS12证书可以包含一个或者多个证书,并且还可以包含证书对应的私钥。openssl的pkcs12指令可以将X.509格式的证书和私钥封装成PKCS#12格式的证书,也可以将PKCS#12证书转换成X.509证书

PKCS#12证书的后缀名通常是p12或者pdx

PKCS#7证书: PKCS#7可以封装一个或者多个X.509证书或者PKCS#6证书,并且可以包含CRL信息。PKCS#7证书中也不包含私钥信息。openssl提供了crl2pkcs7和pkcs7两个指令来生成和处理PKCS#7文件,可以使用他们在X.509证书和PKCS#7证书之间进行转换和处理

PKCS#7证书的后缀名是p7b

3 密钥编码

openssl有多种形式的密钥,openssl提供PEM和DER两种编码方式对这些密钥进行编码,并提供相关指令可以使用户在这两种格式之间进行转换

openssl密钥大致可以分为两种,一种是可以公开的,例如公钥,一种是不能公开的,比对私钥。反映在编码上,有的密钥需要加密,有的密钥就不需要加密。一个经过加密的PEM编码密钥文件会在PEM文件中增加一些头信息,表明密钥的加密状态,加密算法及初始化向量等信息

openssl指令提供了对密钥加密的功能,并提供了多种可选的对称加密算法,比如DES和DES3。当对密钥进行加密的时候通常需要用户输入口令,这里的口令并非直接用来作为加密的密钥,而是根据这个口令使用一系列HASH操作来生成一个用户加密密钥数据的密钥。当读取这类密钥的时候,同样需要输入同样的口令。

openssl ans.1编码规则分析及证书密钥编码方式的更多相关文章

  1. 建立标准编码规则(四)-C#编码规范分类及实现

    1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...

  2. WEB前端 [编码] 规则浅析

    前言 说到前端安全问题,首先想到的无疑是XSS(Cross Site Scripting,即跨站脚本),其主要发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被 ...

  3. 通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]

    一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的 ...

  4. X.509证书的编码及解析:程序解析以及winhex模板解析

    一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...

  5. IIS8中使用OpenSSL来创建CA并且签发SSL证书

    前言 [转载]http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certi ...

  6. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...

  7. URL编码规则

    一.问题的由来 问题:当url地址中包含&.+.%等特殊字符(主要是传递参数时,参数的内容中包含这些字符)时,地址无效.比如http://10.190.0.0:108/doc/test+des ...

  8. UTF-8编码规则(转)

    from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...

  9. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

随机推荐

  1. mysql高可用方案MHA介绍

    mysql高可用方案MHA介绍 概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA, ...

  2. HTML基础知识笔记(三)

    HTML下拉列表框 讲解: 1.value: <option value="House Blend">House Blend</option> 2.sele ...

  3. Geodatabase - 打开数据库(工作空间)

    //使用IName方式打开数据库(工作空间). public void GetWorkspace_IName(string workspacePath) { ESRI.ArcGIS.Geodataba ...

  4. 集合运算符之全集、交集、补集【weber出品必属精品】

    集合的概念 与数学中的全集.交集.补集的概念是一样的 常用的集合运算符 集合运算符的作用:把两个查询构造为一个联合查询 1. 全集:求连个查询的全集 union all:将两个查询的所有数据全部列出, ...

  5. C++深层复制解决指针悬挂

    代码: #include <iostream> #include <cstring> using namespace std; class mystring{ public: ...

  6. GetClientRect()和GetWindowRect()

    GetClientRect()   是得到客户区坐标系下客户区的RECT GetWindowRect()是得到屏幕坐标系下整个窗口的RECT GetSystemMetrics()是获得屏幕分辨率大小 ...

  7. 编译Boost 详细步骤

    vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会 ...

  8. Android 代码编辑器中实现代码语法高亮

    想写一款Android手机上的代码编辑器,实现类似c4droid中代码语法高亮 通过Android中的控件WebView中嵌入html网页,html引入CodeMirror这个第三方库就可以了,其实就 ...

  9. IC封装图片认识(二):SOP&SOJ

    SOP SOP-EIAJ-TYPE-II-14L SSOP SSOP-16L TSOP(Thin Small Outline Package) TSSOP(Thin Shrink Outline Pa ...

  10. 猎豹上市(猎豹的广告收入中有70%来自BAT三家公司,总收入中有58%来自BAT)

    发表日期: 2014 年 5 月 9 日 From 网易专题 文/赵楠 村里那点儿事 猎豹移动上市之夜,我挺激动. 激动除了因为有好朋友在这家公司外,也因为猎豹移动在历史上的几次起承转合非常不易,在巨 ...