在做聚合支付系统的时候,少不了和渠道对接,和渠道通信就涉及摘要、签名、加解密和各种加密算法,我刚开始被这些概念搞的云里雾里,现在就来逐个解读
消息摘要
消息摘要也称数字摘要,是将任意长度的消息变成固定长度的短消息
那为什么要对传输的数据做摘要:
- 保护数据
摘要是不可逆的,即使传输过程中被人窃取了数据也无法还原为明文 - 确保传递真实的信息
防止消息在传输过程中被篡改,一旦消息被改动过,摘要生成的hash值必然不同,所以对比摘要就可以知道传输的消息有没有被人篡改
散列函数
消息摘要一般采用散列算法(散列函数)把消息或数据压缩成摘要,散列(Hashing)的意思是——电脑科学中一种对数据的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。可以简单理解为,散列就是把数据做成字典,把索引和内容关联起来,把原空间的数据集映射到一个更小的空间。
所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为“散列碰撞"(collision)。因为既然是把原空间的数据集映射到一个更小的空间,那么必然会出现两个不同的输入散列成同一个hash值。不过好的散列函数在输入域中很少出现散列冲突(碰撞)。
常见的hash函数:
算法名称 | 输出大小(bits) | 内部大小 | 区块大小 | 长度大小 | 字符尺寸 | 碰撞情形 |
---|---|---|---|---|---|---|
HAVAL | 256/224/192/160/128 | 256 | 1024 | 64 | 32 | 是 |
MD2 | 128 | 384 | 128 | No | 8 | 大多数 |
MD4 | 128 | 128 | 512 | 64 | 32 | 是 |
MD5 | 128 | 128 | 512 | 64 | 32 | 是 |
PANAMA | 256 | 8736 | 256 | 否 | 32 | 是 |
RadioGatún | Arbitrarily long | 58 words | 3 words | 否 | 1-64 | 否 |
RIPEMD | 128 | 128 | 512 | 64 | 32 | 是 |
RIPEMD-128/256 | 128/256 | 128/256 | 512 | 64 | 32 | 否 |
RIPEMD-160/320 | 160/320 | 160/320 | 512 | 64 | 32 | 否 |
SHA-0 | 160 | 160 | 512 | 64 | 32 | 是 |
SHA-1 | 160 | 160 | 512 | 64 | 32 | 有缺陷 |
SHA-256/224 | 256/224 | 256 | 512 | 64 | 32 | 否 |
SHA-512/384 | 512/384 | 512 | 1024 | 128 | 64 | 否 |
Tiger(2)-192/160/128 | 192/160/128 | 192 | 512 | 64 | 64 | 否 |
WHIRLPOOL | 512 | 512 | 512 | 256 | 8 | 否 |
其中最为我们熟悉的是MD5和SHA256算法,关于MD5和SHA256的实现原理可以看这两篇文章——漫画:什么是MD5算法?、加密算法原理分析(MD5、SHA-256),图文并茂,讲的非常好
数字签名
数字签名是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。发送方和接收方每个人都有一对“钥匙”(数字身份),其中一个只有本人知道(私钥),另一个公开的(公钥)。签名的时候用私钥,验证签名的时候用公钥。我们可以直接对消息进行签名(即使用私钥加密,此时加密的目的是为了签名,而不是保密),验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功。但通常我们会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得签名(非对称加密)的效率大大提高。注意,计算消息的散列值不是数字签名的必要步骤。
通常我们使用公钥加密,用私钥解密。而在数字签名中,我们使用私钥加密(相当于生成签名),公钥解密(相当于验证签名)。因为私钥只有发送方持有,能用公钥解密证明了消息是私钥持有者发送过来的。一言以蔽之,数字签名就是将公钥密码反过来使用。
签名用到的非对称加密算法一般是RSA,关于RSA的介绍和原理可以参考阮一峰老师写的——RSA算法原理(一)、RSA算法原理(二)
数字证书
鲍勃想给苏珊发消息,并附上数字签名证明是发送者是鲍勃,数字签名貌似万无一失,但假若黑客把接收方的公钥换成自己的公钥,然后黑客用自己的私钥签名冒充鲍勃的签名,这时接收方不知道公钥被换了,验签成功,但消息却不是鲍勃发过来的。
这个时候就需要第三方公证人——"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
参考文献:
数字签名是什么?