md5是签名算法吗?签名算法不是说要包含抗抵赖性,数据的完整性要求么?我想知道md5是怎么做到抗抵赖性的,为什么大家都说用md5对数据进行签名呢?求解答。
md5并不是签名算法,也不是加密算法,他只是一种摘要算法。使用md5对数据进行签名,其实与网站中将用户明文密码md5之后入库是一个道理。当用户输入密码时,我只需要通过md5后与库中存储的md5值一致即可认为用户输入的密码正确。而文件签名也一样,拿到该文件后,只需要将文件md5后的值与所给的md5值一致,即可认为该文件未曾被篡改。
md5算法保证了,参与处理的内容只要有一个字节变化,最终的计算值也会发生巨大的变化,而想要找到两个一致的md5的对应内容,是及其困难的。
MD5和SHA1这些属于摘要算法,可以用来校验数据,避免数据被篡改.
不过长明文生成短摘要存在哈希碰撞(散列冲突)的可能,也就是不同的字符串用MD5计算产生相同结果.
不过这种可能性很小,也就是你很难找到摘要相同的两个明文.
签名算法一般用的是RSA,具体就是私钥签名,公钥验证.
Android应用安装包APK也用到了摘要算法SHA1.
META-INF/MANIFEST.MF里记录的就是APK包里每个文件的摘要信息.
Android签名则用到了RSA.
META-INF/CERT.RSA里保存的就是加密后的摘要信息以及解密时用到的公钥.
APK签名的作用就是:
APK包的内容被第三方篡改后,将不能正常安装.
因为篡改包里面的文件后,文件的摘要值就会变化.
APK安装时Android发现文件和摘要不同会拒绝安装.
因为CERT.RSA加密了一份MANIFEST.MF摘要信息,
所以就算篡改者改了MANIFEST.MF也没用,
Android解密CERT.RSA后发现摘要信息跟MANIFEST.MF不同也拒绝安装.
而篡改者又改不了CERT.RSA,因为篡改者不知道生成CERT.RSA的私钥.
就算篡改者自己重新签名打包,因为公钥不同,Android也是不允许覆盖系统同名应用的.
这就是签名的作用:
验证了内容是拥有私钥的发布者发出的.
md5不是签名算法。md5是用来校验一个文件的完整性的。比如你有一个文件,大小是2M,你生成一个md5值,在传输文件的时候,告诉接收方这个文件的md5值,接收方在收到文件后,再运行一遍md5,把得到的md5值和你告诉对方的md5值进行比较,如果不相同,说明文件被篡改了。在通常情况下,不同文件生成的md5值不同,哪怕两个文件只有一个字节或者一个二进制位的差异,md5值也不相同。但是在极个别情况下,不同文件还是有可能会得到相同的md5值,所以md5不能完全保证文件的唯一性。在传输文件的时候,文件和md5值都是以明文方式传输,没有加密。数字签名则是有一对公钥和私钥,传输之前用私钥加密,任何人都可以用公钥解密,但是不掌握私钥的人,想把解密后的文件再加密回原始状态是不可能的,这样就保证了其不可抵赖性。