什么是ASN.1(抽象语法标记)?ASN有哪些优点?

2023年2月27日15:50:55什么是ASN.1(抽象语法标记)?ASN有哪些优点?已关闭评论

ASN.1的基本概念

在网络通信中,大多数网络都采用了多个制造商的设备,这些设备所采用的“局部语法”都是不一样的。这些差异就决定了同一数据对象在不同的计算机上被表示为不同的符号串。为了使不同制造商设备之间能够实现互通,就必须引入一种数据序列化的方法,它是一种标准的与具体的网络环境无关的语法格式,目前出现了以下几种数据序列化的方法:ASN.1、XML、JSON等。其中,ASN.1愈发流行,尤其是在密码学领域。

ASN.1(Abstract Syntax Notation One,抽象语法标记)是一种ISO/ITU-T标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行以及这些数据的具体指代,也不用去管到底是什么样的应用程序。

在任何需要以数字方式发送信息的地方,ASN.1都可以发送各种形式的信息(声频、视频、数据等)。ASN.1和特定的ASN.1编码规则推进了结构化数据的传输,尤其是网络中应用程序之间的结构化数据传输,它以一种独立于计算机架构和语言的方式来描述数据结构。

ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法,它与语言实现和物理标识无关,即使用ASN.1描述的数据结构需要具象化,也就是编码。标准的ASN.1编码规则有基本编码规则(BER, Basic Encoding Rules)、规范编码规则(CER, Canonical Encoding Rules)、唯一编码规则(DER, Distinguished Encoding Rules)、压缩编码规则(PER, Packed Encoding Rules)和XML编码规则(XER, XML EncodingRules)。其中,DER编码是最常见的。

ASN.1可以与C语言进行类比,ASN.1的主要用途是描述数据结构,而C语言的主要用途是控制程序走向。使用ASN.1可以描述复杂的数据对象,比如一块数据中哪里是长度、哪里是内容、哪里是标志等(类似C语言的struct)。ASN.1可以转换为C、Java语言等的数据结构。

1984年,ASN.1已经成为一种国际标准。它的编码规则已经成熟并经受住了可靠性和兼容性考验。

在电信和计算机网络领域,ASN.1是一套标准,是描述数据的表示、编码、传输、解码的灵活记法。它提供了一套正式、无歧义和精确的规则,以描述独立于特定计算机硬件的对象结构。ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。

ASN.1作为一门抽象的计算机语言,有自己的语法,其语法遵循传统的巴科斯范式BNF风格。例如:Name ::= type表示定义某个名称为Name的元素,它的类型为type;MyName ::= IA5String表示定义了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String(类似于ASCII字符串)。

ASN.1的编码格式

ASN.1的编码格式有很多种(BER、CER、DER、XER),可以编码成XML格式,不仅仅是常用的二进制流。BER、CER、DER是ASN.1的三种常用编码格式。

所有X.509都是DER编码的。DER是指ASN.1的编码规则,.der证书文件一般是二进制文件。CER可用于PKCS#7证书(p7b)的编码,但一般是指证书的文件后缀,.cer证书可以是纯BASE64文件或二进制文件。PEM通常也是指文件的后缀,为内容使用Base64编码且带头带尾的特定格式,二进制的文件不应该命名为pem。CRT是微软的证书后缀名,和.CER是一回事。

微软的CryptAPI很强大,证书的各种格式都可以识别,比如纯Base64编码的、标准PEM格式的、非标识PEM格式的(不是64字节换行、没有头尾等)、二进制格式的。

ASN的优点

简单地说,ASN有三大主要优点:

(1)独立于机器。

(2)独立于程序语言。

(3)独立于应用程序的内部表示,用一种统一的方式来描述数据结构。

有了这三大优点,ASN就能解决如下几个问题:

(1)程序语言之间的数据类型不同。

(2)不同机器平台之间的数据存储方式不同。

(3)不同种类的计算机内部数据表示不同。

比如:IBM公司采用的字符编码表是为EBCDIC(Extended Binary Coded Decimal Interchange Code),而美国国家标准学会(American National Standard Institute, ANSI)制定的字符编码表是ASCII(American Standard Code for Information Interchange,美国信息交换标准代码);Intel的芯片从右到左计数字节数,而Motorola的芯片则从左到右计数字节数。

在任何需要以数字方式发送信息的地方都可以使用ASN.1发送各种形式的信息,包括音频、视频、图片、数据等。各种系统对数据的定义并不完全相同,给利用其他系统的数据造成了障碍。表示层担负了消除这种障碍的任务。表示层如同应用程序和网络之间的翻译官,主要解决用户信息的语法表示问题,即提供统一的、格式化的表示和转换数据服务。数据的压缩、解压、加密、解密都在该层完成。

基本语法规则

在ASN.1中,符号的定义没有先后次序:只要能够找到该符号的定义即可,而不必关心在使用它之前是否被定义过。

所有的标识符、参考、关键字都要以一个字母开头,后接字母(大、小写都可以)、数字或者连字符“-”,不能出现下画线“_”,不能以连字符“-”结尾,不能出现两个连字符(注释格式)。

关键字一般都是全部大写的,除了一些字符串类型(如PrintableString、UTF8String等,因为这些都是由原类型OCTET STRING衍生出来的)。

在标识符中,只有类型和模块名字是以大写字母开头的,其他标识符都是以小写字母开头的。

带小数点的小数形式不能在ASN.1中直接使用,在ASN.1中实数实际定义为三个整数:尾数、基数和指数。

注释以两个连字符“--”开始,结束于行的结尾或者该行中另一个双连字符。

如同大多数计算机语言,ASN.1不对空格、制表符、换行符和注释做翻译,但是在定义符号(或者分配符号Assignment)“::=”中不能有分隔符,否则不能正确处理。

  • A+
所属分类:JAVA
  • 版权声明:本篇文章(包括图片)来自网络,由程序自动采集,著作权(版权)归原作者所有,如有侵权联系我们删除,联系方式(QQ:452038415)。