我们讨论验证数据是否完整性,也就是确定这个数据就是你想要的那个数据,所有数据只不过是一些数据。就像加密,有2种基本的方法检查数据完整性(data integrity),使用对称密钥和非对称密钥,他们叫信息鉴别码(Message Authentication Codes,MACs)和数字签名(Digital Signatures)。
你可以用一个算法或hash算法完成信息鉴别码;后者叫HMACs。数字签名比信息鉴别码的功能更为强大,但是信息鉴别码更快。当一个信息鉴别码的使用者用对称密钥的时候,任何人知道都这个密钥可以重写数据,信息鉴别码则需要那个才可以进行鉴别数据的完整。这2个部分合作的非常好,当他们在一堆组件中时就不那么好了。与此相反,数字签名需要一对密钥私钥的那一半,任何人有公钥都可以验证他。这个性质允许数字签名可以用一个签名人来发布文件和多个验证机。这个技术被用来检查软件中的信息是没有被更改的,是来自制定者的源。这个在通信和数据存储方面很有用。MACs可以像SSL协议一样阻止攻击者偷偷的修改数据比特流,或添加什么东西删除什么东西。
我们用来数字签名的算法是RSA和DSA。RSA 可以签名也可以加密。DSA有趣在它是一个只能签名的算法。同样有我们前面提到过的DSA 的椭圆曲线算法的ECDSA。它可以做到创建用Elgamal 算法的数字签名,但是这还不是典型。在此同时,OpenPGP标准c允许Elgamal数字签名,但是自那以后就删除不用了。
如果你在使用了数字签名后准备一些数学的实际研究,你就会看到一些关于签名的也是加密的描述,但是加密用私钥加密比公钥好。这对RSA来说是对的,但是不适合DSA和Elgmal。原因是Elgamal签名使用中有一些很奇怪的问题。设计DSA签名就是为了减少Elgamal签名问题,他有比Elgamal签名和RSA签名更短的其它优势。
无论你使用什么算法来创建签名,数据本身没有被像写字一样的签名,可以说是在数据在hash算法上面的签名。我们做这个原因有2点。第一,当你回忆加密的时候,公钥加密算法在数据的区块上操作,你必须操作数据的大小比密钥的大的地方(这是最多的问题),多次重试以后。你可以用数字签名来签名无论有多大的数据,还可以把这些分卷组合起来。第二,这将会非常慢。所以体积比较小的目标文件会非常快。只有hash算法表现良好,这也是合理之中的事情
那就是为什么密码员关心hash的长度和安全。数字签名混合了原始签名和hash值。如果这里出现的问题,数字签名中也会出现问题。
数字签名很重要是因为他提供了数字完整性和在验证的数据上加密。Hash算法的一项功能是可以告诉你数据是否被改变 ,但是你必须分开去验证的所有数据,得到hash表。如果你是个验证者,使用数字签名你需要数据和他的签名。你同样有签名人的公钥,你需要签名者中任意一个人的签名。作为一个签名者,你需要把私钥保存好,你签名的时候不需要对签名的文件特别担心。有趣的是,签名人也无需保存私钥。也可以签名后删除签名密钥中的私有部分。甚至签名部分的数字签名因为错误而丢失都可以完成验证。