1、信息摘要和数字签名概述
信息摘要:对数据进行处理,得到一段固定长度的结果,其特点输入:
1、输出长度固定。即输出长度和输入长度无关。
2、不可逆。即由输出数据理论上不能推导出输入数据
4、对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化
5、防碰撞。即不同的数据数据得到相同输出数据的可能性极低。
由于信息摘要有上述特点,一般保证数据的完整性,对一个大文件进行摘要运算,得到其摘要值。通过网络或者其他渠道传输后,通过验证其摘要值,确定大文件本身有没有发生变化。
数字签名:数字签名其实分成两步,首先对原始文件进行摘要运算,得到摘要值,然后使用公开密钥算法中的私钥对摘要值进行加密。其签名和验证过程如下图所示
有数字签名的过程可以知道,对发送信息进行数字签名,可以保证数字签名的完整性、真实性、不可抵赖性。即接收者可以确认消息的来源、消息的真实,发送者不可以抵赖自己发送的消息,与现实生活中签名的作用大致相同。
2、摘要算法和数字签名相关指令及用法目前openssl提供的摘要算法有md4、md5、ripemd160、sha、sha1、sha224、sha256、sha512、sha384、wirlpool。可以通过openssl dgst -命令查看。
上面我们已经提到了,数字签名分为摘要和加密两部分。在openssl提供的指令中,并没有区分两者。而是在摘要算法指令中包含了签名和校验参数。例如我们适用openssl md5 -命令可以看到它提供的选项有签名和验证等参数。
在openssl中单独使用摘要算法指令完成摘要或者签名操作,也可以通过dgst完成相同的操作。在签名的时候多数使用RSA私钥或者DSA私钥,当使用RSA私钥的时候,我们可以使用单独的摘要算法指令指定摘要算法进行签名,但当使用DSA使用签名的时候,就必须使用dgst指令,因为使用DSA签名的时候必须使用DSA自身的摘要算法,而openssl没有为它提供相应的指令。
/*有明文文件file.txt和RSA密钥RSA.pem*/
linuxidc@linuxidc:~/test$ ls file.txt RSA.pem/*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/
linuxidc@linuxidc:~/test$ openssl md5 -sha1 -sign RSA.pem -out sign1.txt file.txt
/*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/
linuxidc@linuxidc:~/test$ openssl dgst -sha1 -sign RSA.pem -out sign2.txt file.txt
/*两个签名文件一样,说明两个指令完成相同的功能*/
linuxidc@linuxidc:~/test$ diff sign1.txt sign2.txt
可以看到md5和dgst完成相同的功能。不过让人纠结的是使用md5进行签名的时候可以指定其他摘要算法,笔者觉得太别扭了。所以建议做摘要和签名验证时使用dgst指令,忘记其他……
dgst指令用法介绍如下
linuxidc@linuxidc:~/test$ openssl dgst -
unknown option'-'
options are
-c to output the digest with separating colons //输出的摘要信息以分号隔离,和-hex同时使用
-r to output the digest in coreutils format //指定输出的格式
-d to output debug info //输出BIO调试信息
-hex output as hex dump //以16进制打印输出结果
-binary output in binary form //输出二进制结果
-hmac arg set the HMAC key to arg //指定hmac的key
-non-fips-allow allow use of non FIPS digest //允许使用不符合fips标准的摘要算法
-sign file sign digest using private key in file //执行签名操作,后面指定私钥文件
-verify file verify a signature using public key in file //执行验证操作,后面指定公钥文件,与prverfify不能同时使用
-prverify file verify a signature using private key in file //执行验证操作,后面指定密钥文件,与verfify不能同时使用
-keyform arg key file format (PEM or ENGINE) //指定密钥文件格式,pem或者engine
1、仅做摘要运算而不做签名操作