簽名算法
我們使用非對稱加密算法的時候,對於一個公鑰-私鑰對,通常是用公鑰加密,私鑰解密。
如果使用私鑰加密,公鑰解密是否可行呢?實際上是完全可行的。
不過我們再仔細想一想,私鑰是保密的,而公鑰是公開的,用私鑰加密,那相當於所有人都可以用公鑰解密。這個加密有什么意義?
這個加密的意義在於,如果小明用自己的私鑰加密了一條消息,比如小明喜歡小紅
,然后他公開了加密消息,由於任何人都可以用小明的公鑰解密,從而使得任何人都可以確認小明喜歡小紅
這條消息肯定是小明發出的,其他人不能偽造這個消息,小明也不能抵賴這條消息不是自己寫的。
因此,私鑰加密得到的密文實際上就是數字簽名,要驗證這個簽名是否正確,只能用私鑰持有者的公鑰進行解密驗證。使用數字簽名的目的是為了確認某個信息確實是由某個發送方發送的,任何人都不可能偽造消息,並且,發送方也不能抵賴。
在實際應用的時候,簽名實際上並不是針對原始消息,而是針對原始消息的哈希進行簽名,即:
signature = encrypt(privateKey, sha256(message))
對簽名進行驗證實際上就是用公鑰解密:
hash = decrypt(publicKey, signature)
然后把解密后的哈希與原始消息的哈希進行對比。
因為用戶總是使用自己的私鑰進行簽名,所以,私鑰就相當於用戶身份。而公鑰用來給外部驗證用戶身份。
常用數字簽名算法有:
- MD5withRSA
- SHA1withRSA
- SHA256withRSA
它們實際上就是指定某種哈希算法進行RSA簽名的方式。
使用其他公鑰,或者驗證簽名的時候修改原始信息,都無法驗證成功。
DSA簽名
除了RSA可以簽名外,還可以使用DSA算法進行簽名。DSA是Digital Signature Algorithm的縮寫,它使用ElGamal數字簽名算法。
DSA只能配合SHA使用,常用的算法有:
- SHA1withDSA
- SHA256withDSA
- SHA512withDSA
和RSA數字簽名相比,DSA的優點是更快。
ECDSA簽名
橢圓曲線簽名算法ECDSA:Elliptic Curve Digital Signature Algorithm也是一種常用的簽名算法,它的特點是可以從私鑰推出公鑰。比特幣的簽名算法就采用了ECDSA算法,使用標准橢圓曲線secp256k1。BouncyCastle提供了ECDSA的完整實現。
練習
從下載練習:簽名算法練習 (推薦使用IDE練習插件快速下載)
小結
數字簽名就是用發送方的私鑰對原始數據進行簽名,只有用發送方公鑰才能通過簽名驗證。
數字簽名用於:
- 防止偽造;
- 防止抵賴;
- 檢測篡改。
常用的數字簽名算法包括:MD5withRSA/SHA1withRSA/SHA256withRSA/SHA1withDSA/SHA256withDSA/SHA512withDSA/ECDSA等。