信息摘要:对数据进行处理,获得一段固定长度的结果,其特色输入:算法
一、输出长度固定。即输出长度和输入长度无关。服务器
二、不可逆。即由输出数据理论上不能推导出输入数据网络
四、对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化加密
五、防碰撞。即不一样的数据数据获得相同输出数据的可能性极低。spa
因为信息摘要有上述特色,通常保证数据的完整性,对一个大文件进行摘要运算,获得其摘要值。经过网络或者其余渠道传输后,经过验证其摘要值,肯定大文件自己有没有发生变化。debug
数字签名:数字签名其实分红两步,首先对原始文件进行摘要运算,获得摘要值,而后使用公开密钥算法中的私钥对摘要值进行加密。其签名和验证过程以下图所示调试
有数字签名的过程能够知道,对发送信息进行数字签名,能够保证数字签名的完整性、真实性、不可抵赖性。即接收者能够确认消息的来源、消息的真实,发送者不能够抵赖本身发送的消息,与现实生活中签名的做用大体相同。code
目前openssl提供的摘要算法有md四、md五、ripemd160、sha、sha一、sha22四、sha25六、sha5十二、sha38四、wirlpool。能够经过openssl dgst -命令查看。orm
上面咱们已经提到了,数字签名分为摘要和加密两部分。在openssl提供的指令中,并无区分二者。而是在摘要算法指令中包含了签名和校验参数。例如咱们适用openssl md5 -命令能够看到它提供的选项有签名和验证等参数。blog
在openssl中单独使用摘要算法指令完成摘要或者签名操做,也能够经过dgst完成相同的操做。在签名的时候多数使用RSA私钥或者DSA私钥,当使用RSA私钥的时候,咱们可使用单独的摘要算法指令指定摘要算法进行签名,但当使用DSA使用签名的时候,就必须使用dgst指令,由于使用DSA签名的时候必须使用DSA自身的摘要算法,而openssl没有为它提供相应的指令。
/*有明文文件file.txt和RSA密钥RSA.pem*/ xlzh@cmos:~/test$ ls file.txt RSA.pem /*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/ xlzh@cmos:~/test$ openssl md5 -sha1 -sign RSA.pem -out sign1.txt file.txt /*使用md5指令指定sha1算法,对file.txt进行签名,生成签名文件sign1.txt*/ xlzh@cmos:~/test$ openssl dgst -sha1 -sign RSA.pem -out sign2.txt file.txt /*两个签名文件同样,说明两个指令完成相同的功能*/ xlzh@cmos:~/test$ diff sign1.txt sign2.txt
能够看到md5和dgst完成相同的功能。不过让人纠结的是使用md5进行签名的时候能够指定其余摘要算法,笔者以为太别扭了。因此建议作摘要和签名验证时使用dgst指令,忘记其余……
dgst指令用法介绍以下
xlzh@cmos:~/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
-out filename output to filename rather than stdout //指定输出文件,默认标准输出 -signature file signature to verify //指定签名文件,在验证签名时使用 -sigopt nm:v signature parameter //签名参数 -hmac key create hashed MAC with key //制做一个hmac 使用key -mac algorithm create MAC (not neccessarily HMAC) //制做一个mac -macopt nm:v MAC algorithm parameters or key //mac算法参数或者key -engine e use engine e, possibly a hardware device. //使用硬件或者三方加密库 -md4 to use the md4 message digest algorithm //摘要算法使用md4 -md5 to use the md5 message digest algorithm //摘要算法使用md5 -ripemd160 to use the ripemd160 message digest algorithm //摘要算法使用ripemd160 -sha to use the sha message digest algorithm //摘要算法使用sha -sha1 to use the sha1 message digest algorithm //摘要算法使用sha1 -sha224 to use the sha224 message digest algorithm //摘要算法使用sha223 -sha256 to use the sha256 message digest algorithm //摘要算法使用sha256 -sha384 to use the sha384 message digest algorithm //摘要算法使用sha384 -sha512 to use the sha512 message digest algorithm //摘要算法使用sha512 -whirlpool to use the whirlpool message digest algorithm //摘要算法使用whirlpool
一、仅作摘要运算而不作签名操做
/*对file.txt文件使用sha1算法进行hash运算*/ xlzh@cmos:~/test$ openssl dgst -sha1 file.txt SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
/*指定–non-fips-allow参数,与fips标准有关,尚待研究*/
xlzh@cmos:~/test$ openssl dgst –sha1 –non-fips-allow file.txt
SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9
/*指定-d参数,打印调试消息*/ xlzh@cmos:~/test$ openssl dgst -sha1 -d file.txt BIO[02469910]:ctrl(6) - FILE pointer BIO[02469910]:ctrl return 0 BIO[02469910]:ctrl(108) - FILE pointer BIO[02469910]:ctrl return 1 BIO[02469910]:read(0,8192) - FILE pointer BIO[02469910]:read return 37 BIO[02469910]:read(0,8192) - FILE pointer BIO[02469910]:read return 0 SHA1(file.txt)= c994aec2a9007221a9b9113b8ab60a60144740c9 BIO[02469910]:ctrl(1) - FILE pointer BIO[02469910]:ctrl return 0 BIO[02469910]:Free - FILE pointer /*指定-c -hex参数,以16进制打印结果*/ xlzh@cmos:~/test$ openssl dgst -sha1 -c -hex file.txt SHA1(file.txt)= c9:94:ae:c2:a9:00:72:21:a9:b9:11:3b:8a:b6:0a:60:14:47:40:c9 /*指定-r参数,输出结果以下所示,然并卵……*/ xlzh@cmos:~/test$ openssl dgst -sha1 -r file.txt c994aec2a9007221a9b9113b8ab60a60144740c9 *file.txt /*指定-binary参数,输入结果为二进制*/ xlzh@cmos:~/test$ openssl dgst -sha1 -binary file.txt ɔ�©r!��;�� `G@xlzh@cmos:~/test$
二、使用RSA密钥进行签名验证操做
/*摘要算法选取sha256,密钥RSA密钥,对file.txt进行签名*/ xlzh@cmos:~/test$ openssl dgst -sign RSA.pem -sha256 -out sign.txt file.txt /*使用RSA密钥验证签名(prverify参数),验证成功*/ xlzh@cmos:~/test$ openssl dgst -prverify RSA.pem -sha256 -signature sign.txt file.txt Verified OKt /*从密钥中提取公钥*/ xlzh@cmos:~/test$ openssl rsa -in RSA.pem -out pub.pem -pubout writing RSA key /*使用RSA公钥验证签名(verify参数),验证成功*/ xlzh@cmos:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt Verified OK
三、使用DSA密钥进行签名验证操做
/*使用DSA算法,摘要算法sha256,对file.txt进行签名*/ xlzh@cmos:~/test$ openssl dgst -sign DSA.pem -sha256 -out sign.txt file.txt /*使用DSA密钥验证签名*/ xlzh@cmos:~/test$ openssl dgst -prverify DSA.pem -sha256 -signature sign.txt file.txt Verified OK /*使用DSA算法,摘要算法dss1,对file.txt进行签名*/ xlzh@cmos:~/test$ openssl dgst -sign DSA.pem -dss1 -out sign1.txt file.txt /*使用DSA密钥验证签名*/ xlzh@cmos:~/test$ openssl dgst -prverify DSA.pem -dss1 -signature sign1.txt file.txt Verified OK /*提取公钥*/ xlzh@cmos:~/test$ openssl dsa -in DSA.pem -out pub.pem -pubout read DSA key writing DSA key /*使用DSA公钥验证签名*/ xlzh@cmos:~/test$ openssl dgst -verify pub.pem -dss1 -signature sign1.txt file.txt Verified OK /*使用DSA公钥验证签名*/ xlzh@cmos:~/test$ openssl dgst -verify pub.pem -sha256 -signature sign.txt file.txt Verified OK xlzh@cmos:~/test$
根据dgst man手册的定义,若是使用DSA算法进行签名验证,必须使用dss1摘要算法,可是本实验证实使用其余摘要算法也能够签名验证。此处不明白,但愿大牛指点……
四、HMAC的使用
MAC 消息认证码,构造方法能够基于hash,也能够基于对称加密算法,HMAC是基于hash的消息认证码。数据和密钥做为输入,摘要信息做为输出,经常使用于认证。
xlzh@cmos:~/test$ openssl dgst -sha256 -hmac 123456 file.txt HMAC-SHA256(file.txt)= b8e92990b9fc2ac9b58fde06f4738dceb4fb1fc47b4d2234a9c3f152907b333a
例如用户登陆服务器
一、服务器给客户端发送一个随机数
二、客户端使用随机数做为密钥和用户密码作HMAC,结果发送给服务器
三、服务器去除存储的用户密码,也是用随机数与用户密码作HMAC,根据HMAC结果是否同样确认用户身份。
dgst中sigopt、mac、macopt参数的含义即便用方法,由于doc都没给出具体例子,待研究openssl源码后进行补充
为何使用DSA签名的时候能够选择其余hash算法(man 手册说只能使用dss1)
还有dgst的hmac和hmac参数,没错,你没看错,它的确提供了两个彻底同样的参数,给出的解释还不同,仍是研究源码去吧.
可恶的openssl……