开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21天,点击查看活动详情
如何证明你是你?很多人小伙伴会想这不简单嘛,可以提供身份证来证明自己啊!没错,身份证确实可以证明你是你。可能又有小伙伴说道:那也有假冒的身份证啊!没错,但是假冒的身份证能骗过公安系统嘛,我想不需要我做过多的解释,肯定是不行的!
那么网络中的消息如何进行身份证明
呢?我们需要一种称为报文/消息完整性检测(认证、鉴别)
的手段来证实报文确实来自声明的发送方;报文在传输过程中也没有被篡改的痕迹(时间、顺序);并且能防止发送方抵赖说不是其发送的。
完整性检测
我们通常使用密码散列函数(Cryptographic Hash Function) H(m)来表示对一段报文m进行散列化操作。这一函数需要满足以下要求:
- 散列函数算法公开
- 能够快速计算的能力
- 无视需要操作的报文长度最终均能产生定长输出
- 其散列值必须是无法预知
- 不同报文不能产生相同散列值
除了以上这些要求外,散列函数还应该具有如下特性:
- 单向性:即过程不可逆
- 抗弱碰撞性:即对于给定的报文x,计算上不可能找到y且y!=x,使得H(x)=H(y)
- 抗强碰撞性:即在计算上不可能找到任意两个不同的报文x、y,使得H(x)=H(y)
散列函数中典型的有MD5和SHA-1
MD5
MD5(Message-Digest Algorithm 5)诞生于20世纪90年代初,由MIT计算机科学实验室和RSA数据安全公司联手开发出来的,MD5对报文散列后,可以得到128位的散列值。
SHA-1
SHA早期由NIST提出,1993年作为美国联邦消息处理标准公布并在2年后发布修订版SHA-1。作为散列结构的标准,SHA-1可以产生一个160位的散列值。是典型的创建数字签名的单向散 列算法
报文认证的进化史
报文认证其实就是让消息的接收方能检验收到的消息是否是真实的,主要验证消息源和消息内容在传输过程中是否被篡改。如下图所示,对报文m应用散列函数H,得到固定长度散列码称为报文摘要(message digest)记作H(m)。报文摘要可以看作是报文的数字指纹(fingerprint)。
简单报文验证
如下图所示展示了简单报文验证的整个过程,首先发送者将报文m通过散列函数运算后得到一个固定长度的散列码,报文摘要为H(m),然后将包含原报文和报文摘要的扩展报文一起发送给接收者,接收者在接收到扩展报文(m,h)后,提取出其中的m和报文摘要h,对m做同样的散列函数运算,将运算结果与扩展报文中携带的报文摘要做对比,若一致则认证成功,否则认证失败。不过该方案并不完美,因为散列函数是公开的,攻击者可以轻易就获取到从而伪造报文。
报文认证码MAC(Message Authentication Code)
报文认证码MAC这种方式总体流程和简单报文差不多,只是报文的发送者和接收者都共享一个认证密钥s,报文摘要在运算的过程中加入了密钥s,接收方也需要进行同步操作。不过这个方法不安全,因为接收方完全可以自己就伪造一份报文说是发送方发来的。
数字签名
通过分析上面简单报文验证和报文认证码的形式存在不足之处后,我们发现在报文完整性认证过程中,需要解决几个问题,如:报文的不可抵赖性、不可伪造性、匿名性、不可修改性等。数字签名技术可以完美的帮我们解决这些问题。
数字签名在信息安全方面,包括身份认证、数据完整性、不可否认性以及匿名性等方面有重要应用,在很多大型安全通信中的密钥分配、认证和电子商务系统中具有非常重要的地位。数字签名必须满足以下要求:
- 接收方能够确认发件方的签名,但自己无法伪造
- 发送方发出签名消息给接收方后不能否认所签发的信息
- 接收方对已接收的签名信息也无法否认
- 第三者可以确认收发双方的传递过程,但无法伪造
简单数字签名
实际上数字签名就是利用私有密钥进行加密然后用公开密钥进行解密的过程。
签名报文摘要
虽然简单数字签名可以实现信息验证的目的,但由于需要对整个报文进行加密,计算量会很大且效率不高。故可以采取签名报文摘要。