消息认证与数字签名
数字签名验证实验
定义
数字签名,又称公钥数字签名、电子签章,是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,一个用于验证。简单地说,所谓数字签名就是附加在原来数据上一些数据或者对原来数据做一些密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。
基于公钥密码体制和私钥密码体制都可以获得数字签名,主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。
普通数字签名算法:RSA、ElGamal、Fiat-Shamir、Guillou-Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA、椭圆曲线数字签名算法、有限自动机数字签名算法
特殊数字签名:盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名
功能
保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生
解释:数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
数字签名的过程
- 利用一定的算法(如MD5),将要签名的报文作为一个散列函数的输入,产生一个定长的安全散列码,即消息摘要;
使用发送方的私有密钥对这个消息摘要进行加密,形成签名;
将报文和签名传送出去;
接收方接收报文,并根据报文产生一个消息摘要,同时使用发方的公开密钥对签名进行解密;
如果接收方计算得出的消息摘要,和它解密后的签名互相匹配,那么签名就是有效的;
因为只有发送方知道私有密钥,并对签名进行了加密,因此只有发方才能产生有效的签名。
对文件做签名验证
在实验机里打开cmd控制台,进入sigcheck程序目录,输入sigcheck,点击回车,会出现使用说明
以存在的calc为例,把calc所在路径复制到cmd
1 | sigcheck C:\windows\system32\calc.exe |
如下图,会出现,signed,即被签名
现在我们试试另外一个文件
1 | sigcheck helloworld.exe |
很显然,unsigned,这是没有被签名的文件
批量验证文件签名
从上面实验我们可以看到一个一个试文件很繁琐麻烦,很多情况下,我们需要找出某个目录里所有未经过数字签名的文件
1 | sigcheck -e C:\windows\System32 >abc.txt |
执行后可以查看abc.txt文件,发现都是经过数字签名后的
单向哈希函数与mac
我们现在虚拟机上的终端运行
1 | vim 1.txt |
创建一个文件,本人不知道vim的命令语法,于是上万能的百度,现在例举用到的操作
插入模式(按i
键进入) 左下角显示–INSERT–
命令模式(按ESC
键退出)
输入:wq
:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
:q 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑命令历史
1 | openssl dgst -md5 1.txt |
顾名思义,dgst就是消息摘要,这里我们用md5加密
我们试试sha1加密
1 | openssl dgst -sha1 1.txt |
-hmac
指的是加盐加密,我们分别用abcd,abcde,abcdef来加盐,可以看到一个字母的添加带来翻天覆地变化,但是长度都是固定的
1 | openssl dgst -sha1 -hmac”abcd” 1.txt |
现在我们再创建两个txt,分别用MD5进行加密
1 | openssl dgst -md5 2.txt |
我们可以看到数字一样但是位置不一样的文件,它的MD5是完全不一样的,且没有任何规律
1 | cat 2.txt |
powershell调用DLL实现RSA签名
定义
powershell简介
PowerShell是运行在windows机器上实现系统和应用程序自动化管理的命令行脚本环境,是cmd.exe命令行提示符的加强版。它有很好的可读性和易用性。
DLL
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。
RSA签名验证机制
RSA的签名验证用于通信数据防篡改,如图
实验
1 | public void RSAKey(out string xmlKeys, out string xmlPublicKey) //生成RSA密钥对 |
在Powershell中调用操作系统的RSA类库
1 | RSACryption.ps1 |
从中获取明文hash摘要
1 | CheckSigned.ps1 |
签名验证结果返回True,如图所示,表明签名验证结果是正确的。