
我們討論驗證數據是否完整性,也就是確定這個數據就是你想要的那個數據,所有數據只不過是一些數據。就像加密,有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表。如果你是個驗證者,使用數字簽名你需要數據和他的簽名。你同樣有簽名人的公鑰,你需要簽名者中任意一個人的簽名。作為一個簽名者,你需要把私鑰保存好,你簽名的時候不需要對簽名的文件特別擔心。有趣的是,簽名人也無需保存私鑰。也可以簽名後刪除簽名密鑰中的私有部分。甚至簽名部分的數字簽名因為錯誤而丟失都可以完成驗證。
