数字签名有可能被伪造吗

Hash是用来算原文的“摘要”(digest)。而签名是签名一方(通常是服务器)用自己的私钥签在“摘要”上。(Signing with the private key on the digest)“摘要”所有人都能算,只要知道原文,因为hash中并未使用任何原文之外的保密信息。验证签名的是否有效,通常是先算“摘要”, 再以摘要和公钥作为输入,调用验证算法来验证(verify)签名是否有效。而不是先验证签名(即题主所说的公钥解密),再算摘要来比对。再强调一下,Hash是公开的,原文是公开的,所以不需要解密。因此,数字签名的安全性基于:1. Hash算法的抗碰撞性(collision-resistance)即很难找到两个不同的原文 m0, m1,让它们的摘要Hash(m0) = Hash(m1)。例:SHA-3现在比MD5,SHA-2都要安全,很难碰撞。2. 伪造数字签名的难度即对于“新鲜”的原文摘要hash(m*),很难算出一个在它上面的合法签名,除非掌握服务器私钥。所谓“新鲜”是指这个摘要hash(m*)没有被服务器签名过。(签过的原文-签名对没意义,本来就是服务器签的)所以,理论上来说,有下面两种典型的攻击:1. 找与“旧”原文摘要值相同的原文,等价于攻击hash算法,找出碰撞。如使用题主提到的用彩虹表或者其他的手段。2. 直接伪造数字签名。其实,达到伪造任意签名,就可以说完全攻破了这个数字签名系统……回到https, 如果使用的cipher suite是类似TLS_DHE_RSA_WITH_AES_256_CBC_SHA256的, 签名通常出现在server key exchange这条消息中。数字签名使用的算法是RSA,对象是客户端发送的随机数、服务器端发送的随机数、服务器端的密钥交换内容,产生摘要所用的hash函数是SHA256。
■网友
先码 等有时间再答~先复习下数字签名的过程1 数字签名的目的有两点: a,为了保证数据是由客户端期望的服务器发出的数据,而不是第三方劫持后发出的数据。 b, 为了保证原始服务器发出的数据没有被篡改过。为了达到这两个目的,使用了数字签名。2 数字签名的过程: 其实数字签名和正常的非对称加密的过程非常相似,但又有很明显的差别,这里先说下它们的主要区别: 非对称加密: 客户端公钥加密数据,服务器用私钥解密数据 数字签名: 服务器用私钥加密数据,客户端用公钥解密数据。 过程: 服务器端:服务器发送数据时,会经过一个哈希函数,将这份数据计算出一个哈希值,也称作为摘要,然后用服务器的私钥将这个摘要进行加密。最后,服务器会把经过加密后的摘要和数据一起发送给客户端。 客户端: 客户端收到数据后,首先会用公钥解密经过加密后的摘要,如果不能正常解密出摘要,那么说明这份数据不是由原始服务器发出的,这样解决第一个目的a。 然后,客户端通过同样的哈希函数,将数据经过哈希得到摘要,用这个摘要和解密出的摘要进行对比,如果不一致,则说明数据被篡改过,这样解决了第二个目的b。以上就是签名/验签的大概流程。然后说下题主的疑问:如果摘要和签名都被修改了,那么能否达到攻击的目的? 我的理解:如果摘要被修改了,客户端是不能用公钥正常解密出摘要的。
■网友
可能,在密码学里没有不可能,一切都是可以被暴力破解的。(如果你有无穷的资源,包括时间和机器性能)但在现实生活中,第三种的篡改基本不可能。既然HTTP协议用的是SHA256,那么Hash空间就有2的256次方。要在这么大的空间里找到一个符合的原文,简直是大海捞针。更别说SHA256是目前非常安全的压缩算法,它“One-way“的性质保证它无法在实际时间内通过y=hash(x) 得到x 彩虹表是用空间来代替时间的做法,其实本质上也是暴力破解。对于2的256次方这样大的哈希值空间,需要的存储空间简直是难以估算,已经不是TB级别的。题主你可以尝试一下暴力破解词典,就有个大概的概念,算出一个哈希值需要多大的代价。


    推荐阅读