信息加密保证了机密性。这是否意味着只要合理使用加密技术就足够安全了呢p>
答案肯定是否定的。加密技术仅仅解决了信息传递过程中的机密性。但如果信息被攻击者截获,篡改了里面的内容,再用公钥加密发出来,接收人是无法识别的。这里就需要使用电子签名来保证信息的完整性。
散列值
先不急着说电子签名,我们先看看基础知识 – 散列值。
散列值可以认为是信息的“指纹”。众所周知,指纹可以证明人的身份。每个人的指纹都不一样,通过对比指纹,可以确定留下指纹的人是谁。
这里用指纹做类比容易造成误解。请注意散列值是信息的指纹,也就是说 “指纹” 只能证明 “信息” 的身份,就像指纹用来证明人的身份一样。请不要理解为散列值是发信人的指纹。
什么是散列值
我们在三方软件 站下载的某些软件,解压后会有一个 md5 字符串。这个东西就是你下载的软件文件的散列值。我们可以用下载文件重新生成 md5 值与之做对比。如果两者一致,说明软件文件没有被篡改。否则你下载的软件已经被篡改,不要再安装。
md5 其实就是一种散列算法。md5的全称是 Message-Digest Algorithm 5。散列算法的作用就是将一大段信息计算出固定长度的字符串。这个固定长度的字符串就叫做散列值。从 md5 的全称也可以看出,它是信息的摘要,并不是完整信息。
散列函数
计算散列值的函数就叫做散列函数。散列函数也称为单向散列函数。函数的输入是任意长度的信息,输出为固定长度且很短的散列值。
散列函数特性
散列函数应该具备如下特性:
- 计算出的散列值是固定的,并且短。
- 不同的消息,散列值不同。
- 计算的速度要快。信息很长的时候,也要保证快速计算。
同样信息,无论计算几次,算出的散列值要一致。只有这样,散列值才能用来做信息完整性的验证。不同信息散列值不同,确保不会被错误验证。第三点是对计算性能的要求。
有哪些散列函数
MD5
MD5是Rivest于1991年设计的散列函数。产生的散列值长度为128bit。但是MD5已经被攻破,现在可以生成两个相同MD5的不同消息。所以不建议继续使用MD5.
SHA-1
SHA-1 是由NIST(Natinal institute of Standards and Technology)于1993 年设计的散列函数。其产生的散列值长度为160 bit。由于SHA-1也已经被攻破,所以不推荐使用。
SHA-256、SHA-384、SHA512
这些散列函数都是由NIST设计。分别对应散列值长度256、384、512 bit。统称为SHA-2。SHA-2目前还未被攻破,可以放心使用。
散列函数的作用
散列函数用来生成散列值。散列值是消息的指纹,意味着当消息被改动后,生成的散列值也会发生改变。并且不同消息很难生成同样的散列值。根据这些特性,散列函数有如下应用:
密码加密
存储在数据库中的用户密码,肯定不能是明文的,否则任何接触到数据库的人员会看到系统中所有用户的密码,毫无安全可言。一种可行的方案是,将密码加盐后,生成散列值,然后存储到DB中。用户登录时,程序使用输入的密码加盐,重新计算散列值,和DB中保存的散列值对比。如果一致,认为登录成功。这样避免了存储明文密码。
数字签名
消息认证码
消息认证码用于通信过程中检查传输错误和篡改。通过通信双方共享的密钥和信息内容生成散列值,这样发送方和接收方就可以进行检查。
消息认证码
消息认证码解决的问题
消息认证码使用消息和通讯双方共享的密钥生成的散列值。散列值无法用于通信方伪装的识别,但是加上共享密钥后,可以做到这一点。只有使用协商好的密钥生成认证码,通信对方才能生成同样的认证码。如果伪装者不知道密钥,就无法生成正确的认证码。
消息认证码的问题与局限
可以看出消息认证码的机制和对称加密很像,需要通信双方共享密钥。如果看过我之前关于对称加密的文章《加密就像玩魔方—-详解对称加密》,应该了解此处存在密钥配送问题。要解决密钥配送问题之前的文章中也有描述(《图文彻底搞懂非对称加密(公钥密钥)》),这里就不再详述。
通信双方可以使用消息认证码来验证消息来自对方。但是由于二者持有的密码是一样的,因此无法向第三方证明某条消息是谁发出的。谁都有可能用互相知道的密钥生成一段消息的认证码。正是如此,任何一方都可以否认消息是我发出的。
以上是消息认证码的局限,数字签名可以解决这些问题。
数字签名
什么是数字签名
散列值可以看作信息的身份证明,接收方重新为信息生成散列值,和发送方提供的散列值对比,可以证明信息没有被篡改。但是无法证明信息的发送方是谁。
数字签名好比发送方给信息签名盖章、按手印。收信方通过对比手印,判断是否来自合法发送方。
如何进行数字签名
发送方的数字签名,不同接收方都可以验证。是不是有些似曾相识密钥的特点是任何发送方都可以对信息加密,只有接收方可以解密。是不是反过来了,其实数字签名就是公钥密钥的逆向应用。
数字签名也需要用到公钥和私钥。信息发送方使用自己的私钥进行签名。这非常好理解,因为私钥是发送方的身份象征,所以需要用私钥签名。接收方则使用发送方的公钥进行验证。这样任何与发送方通讯的人都可以验证发送方签名。只要发送方保护好自己的私钥,攻击者无法仿造发送方签名。
对称加密需要对整条信息加密,原因在于解密需要还原出完整明文。但是签名不一样,签名只需要验证信息的合法性,并不需要还原签名用到的信息数据。而且由于对整条信息的签名运算非常耗时,实际应用中并不会用完整信息生成签名,而是使用完整信息的散列值来生成签名。因为散列值是信息的指纹,代表了信息的身份。所以只要通信双方协商好散列值算法,同样的信息必然运算出相同的散列值。签名和验签也就能正常工作。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!