[基础技能] 安全技术——数字签名与数字证书以及其中涉及到的相关伪造问题

摘要:
一般来说,当前的加密领域或认证系统使用双重密钥:公钥和私钥。公钥用于加密信息,私钥用于数字签名。

1、首先总结一下数字签名的使用规则和相关流程

讲解比较详细的网络日志可以参考:这里以及这里,我这里只做一些自己的总结。

一般来说现在的加密领域或者是认证体系中,都是在使用双秘钥:公钥和私钥,其中公钥用来加密信息,私钥用来数字签名。任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。

私钥是本人所持有的,不对外公布,公钥是公布给他人的。一对密钥,使用一个加密,必定可以使用另一个进行解密。

一般情况下,数字签名以及验证的流程为:

首先对于要传输的原文,使用HASH计算(一般是SHA1或SHA2),可以得到原文摘要,然后本人使用私钥将原文摘要进行加密,此密文即为传输过程中的签名

接收者收到传输数据后,需要对内容进行验证,查看内容是否为原文,是否被篡改,使用公钥对签名进行解密,得到原文摘要,然后自己在本地也对取得的当前原文进行HASH计算,得到当前原文的摘要,将解密得到的摘要与自己计算得到的摘要进行比对,查看是否一致即可验证。

以上为本人--->接收者的过程,反过来接收者--->本人的过程与此相反,即使用公钥进行加密的过程。

需要注意两点:

1、整个过程中是对原始为篡改原文的摘要进行加密和解密,本地都会进行取得数据的文件摘要的计算,并且与解密出来的摘要进行比对后得出验证结论。

2、当需要验证的文件多了,就需要保存非常多的公钥,就无法管理了,并且本地保存的公钥有可能被篡改替换。为了解决这一问题就需要一个统一的证书管理机构来管理所有需要发送数据方的公钥,对公钥进行认证和加密。这个机构也就是我们常说的CA。认证加密后的公钥,即是证书,又称为CA证书,证书中包含了很多信息,最重要的是申请者的公钥。

这样就对于整个过程又添加了一步包装,申请者使用证书发送数据时,用自己的私钥生成签名,将签名、 证书和发送内容一起发给对方,对方拿到了证书后,需要对证书解密以获取到证书中发送方的公钥,解密需要用到CA机构的”统一密钥对“中的公钥,这个公钥也就是我们常说的CA根证书,通常需要我们到证书颁发机构去下载并安装到相应的收取数据的客户端,如浏览器上面。这个公钥只需要安装一次。有了这个公钥之后,就可 以解密证书,拿到发送方的公钥,然后解密发送方发过来的签名,获取摘要,重新计算摘要,作对比,以验证数据内容的完整性。

验证签名的是否有效,通常是先算“摘要”, 再以摘要和公钥作为输入,调用验证算法来验证(verify)签名是否有效。而不是先验证签名(即题主所说的公钥解密),再算摘要来比对。

你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证

2、HTTPS协议实例

此协议主要是用于网页的加密传输,浏览器向服务器发出访问请求,该请求是以https协议来进行的,那么服务器在接收到请求后就使用私钥加密网页,连同自己本身的数字证书一起发送给浏览器客户端,而浏览器的"证书管理器"中有"受信任的根证书颁发机构"列表,客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

当证书可能被冒用,浏览器会发出警告,或者如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

3、进阶总结以及若干问题

综合上面的过程,需要考虑一下,数字签名的伪造问题,参考这里

  • 1. 原文被篡改 

    肯定是能检验出来的,直接公钥解密数字签名取得哈希值,对比原文的哈希即可验证。

  • 2. 数字签名被篡改

    这也肯定不可能,公钥解密被篡改的数字签名后得到的哈希值(因为加解密算法是公开的,应该能找到一种办法做出一种假的(至上看上去)哈希值)和原文的哈希也对不上

  • 3. 两者皆被篡改

    公钥解密被篡改后的数字签名后得到了假的哈希值,然后用彩虹表搞出原文,这时候,原文的哈希和假哈希一样了,理论上可行,但可能性不大!

理论上来说,有下面两种典型的攻击:
1. 找与“旧”原文摘要值相同的原文,等价于攻击hash算法,找出碰撞。如使用题主提到的用彩虹表或者其他的手段。
2. 直接伪造数字签名。

4、哈希碰撞来伪造数字证书

1中的相关描述可以用一幅流程图来展示:

[基础技能] 安全技术——数字签名与数字证书以及其中涉及到的相关伪造问题第1张

其中一个重点算法过程就是哈希运算,而其他的加密解密都是使用固定好的数据来进行,如果要对数字签名进行伪造,这里哈希运算的过程是第一个可以进行利用的。

获得签名证书一般有几种途径:

1、证书颁发机构购买证书(获得的是原始真实证书)

2、窃取CA的私钥(就可以自行添加指定的证书对,就相当于自己是认证机构,可以为所欲为了,但这个是非常非常困难的)

3、伪造一个同可信证书具有相同哈希值的证书(随着硬件性能的增强,此方法已经是可行的了

伪造的思路就是:

[基础技能] 安全技术——数字签名与数字证书以及其中涉及到的相关伪造问题第2张

就是你找到一个跟签名消息具有相同哈希值的消息,你就可以替换原有的消息,而最终验证签名也不会出错。这就可以用来伪造任何人签署他们本没有签署过的消息。

 其实说到这里这个议题就变成了密码破解了,比如MD5密码破解等等。

 5、密码函数碰撞

方法是使用运用选择前缀碰撞法,找出两个具有相同MD5值的文件,2008年,一些研究人员(包括Marc Stevens和Alex Sotirov)使用选择前缀碰撞法伪造了一个受浏览器信任的证书。其POC在2008年的混沌通信大会上面进行了展示,而为了得到这个POC研究人员也仅花了几天的计算时间。

2012年,一个名为Flame的恶意软件被发现。Flame能通过劫持微软Windows Update服务来感染计算机。当时,Windows Update验证更新文件正是通过验证文件基于MD5数字签名得到的数字证书。Flame的作者伪造了微软的数字证书。通过对伪造证书的分析,发现作者很有可能就是基于选择前缀碰撞技术伪造的证书。

免责声明:文章转载自《[基础技能] 安全技术——数字签名与数字证书以及其中涉及到的相关伪造问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇rollup 使用babel7版本的插件rollup-plugin-babel,rollup-plugin-babel使用报错解决办法。kali渗透综合靶机(五)--zico2靶机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

中间件集群的3大策略

中间件集群的3大策略 1)动态负载均衡策略,一般会搜集多个进程的服务状态,然后挑选一个负载最轻的进程来分发服务,这种策略对于比较同质化的进程是比较合适的。 2)读写分离策略则是关注对持久化数据的性能,比如对数据库的操作,我们会提供一批进程专门用于提供读数据的服务,而另外一个(或多个)进程用于写数据的服务,这些写数据的进程都会每次写多份拷贝到“读服务进程”的...

哈希加密算法 MD5,SHA-1,SHA-2,SHA-256,SHA-512,SHA-3,RIPEMD-160

一、MD5哈希加密算法 atool.org MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的散列算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 将数据(如汉字)运算为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。 MD5一度被...

Android应用签名

http://www.cnblogs.com/ghj1976/archive/2011/07/18/2109381.html 为了要签名?     开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。     由于开发商可能通过使用相同的Package Name来混淆替换已经安...

Android中使用JNI获得APK签名的哈希值

原地址:http://blog.csdn.net/i5suoi/article/details/19036975 最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以这里的关键就是如何在JNI中获得签名...

MD5加密和RSA加密

1.MD5加密    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5算法的使用不需要支付任何版权费用。      MD5的功能:       ①.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);      ②.不同的输入得到的不同的结果(唯一性);      ③.根据128位的输...

【mysql】Innodb三大特性之adaptive hash index

1、Adaptive Hash Indexes 定义 If a table fits almost entirely in main memory, the fastest way to perform queries on it is to use hash indexes. InnoDB has a mechanism that monitors in...