關于數字簽名,先了解下何為數字簽名。數字簽名,就是隻有資訊的發送者才能産生的别人無法僞造的一段數字串,這段數字串同時也是對資訊的發送者發送資訊真實性的一個有效證明。數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。簡單地說,所謂數字簽名就是附加在資料單元上的一些資料,或是對資料單元所作的密碼變換。這種資料或變換允許資料單元的接收者用以确認資料單元的來源和資料單元的完整性并保護資料,防止被人(例如接收者)進行僞造。
數字簽名的主要功能如下:
保證資訊傳輸的完整性、發送者的身份認證、防止交易中的抵賴發生。
數字簽名技術是将摘要資訊用發送者的私鑰加密,與原文一起傳送給接收者。接收者隻有用發送者的公鑰才能解密被加密的摘要資訊,然後用對收到的原文産生一個摘要資訊,與解密的摘要資訊對比。如果相同,則說明收到的資訊是完整的,在傳輸過程中沒有被修改,否則說明資訊被修改過,是以數字簽名能夠驗證資訊的完整性。
數字簽名是個加密的過程,數字簽名驗證是個解密的過程。
數字簽名算法依靠公鑰加密技術來實作的。在公鑰加密技術裡,每一個使用者有一對密鑰:一把公鑰和一把私鑰。公鑰可以自由釋出,但私鑰則秘密儲存;還有一個要求就是要讓通過公鑰推算出私鑰的做法不可能實作。
普通的數字簽名算法包括三種算法:
1.密碼生成算法;
2.标記算法;
3.驗證算法。
通過RSA加密解密算法,我們可以實作數字簽名的功能。我們可以用私鑰對資訊生成數字簽名,再用公鑰來校驗數字簽名,當然也可以反過來公鑰簽名,私鑰校驗。
<a href="https://s3.51cto.com/wyfs02/M00/8C/3B/wKiom1hl2NzzZKNxAADSz3hXVkI109.png" target="_blank"></a>
私鑰簽名
<a href="http://jianboli.blog.51cto.com/#" target="_blank">?</a>
<code>/**</code>
<code> </code><code>* 用私鑰對資訊生成數字簽名</code>
<code> </code><code>* @param data //加密資料</code>
<code> </code><code>* @param privateKey //私鑰</code>
<code> </code><code>* @return</code>
<code> </code><code>* @throws Exception</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>static</code> <code>String sign(</code><code>byte</code><code>[] data,String privateKey)</code><code>throws</code> <code>Exception{ </code><code>//解密私鑰</code>
<code> </code><code>byte</code><code>[] keyBytes = decryptBASE64(privateKey); </code><code>//構造PKCS8EncodedKeySpec對象</code>
<code> </code><code>PKCS8EncodedKeySpec pkcs8EncodedKeySpec = </code><code>new</code> <code>PKCS8EncodedKeySpec(keyBytes); </code><code>//指定加密算法</code>
<code> </code><code>KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); </code><code>//取私鑰匙對象</code>
<code> </code><code>PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec); </code><code>//用私鑰對資訊生成數字簽名</code>
<code> </code><code>Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);</code>
<code> </code><code>signature.initSign(privateKey2);</code>
<code> </code><code>signature.update(data); </code>
<code> </code><code>return</code> <code>encryptBASE64(signature.sign());</code>
<code> </code><code>}</code>
公鑰校驗
<code> </code><code>* 校驗數字簽名</code>
<code> </code><code>* @param data 加密資料</code>
<code> </code><code>* @param publicKey 公鑰</code>
<code> </code><code>* @param sign 數字簽名</code>
<code> </code><code>public</code> <code>static</code> <code>boolean</code> <code>verify(</code><code>byte</code><code>[] data,String publicKey,String sign)</code><code>throws</code> <code>Exception{ </code><code>//解密公鑰</code>
<code> </code><code>byte</code><code>[] keyBytes = decryptBASE64(publicKey); </code><code>//構造X509EncodedKeySpec對象</code>
<code> </code><code>X509EncodedKeySpec x509EncodedKeySpec = </code><code>new</code> <code>X509EncodedKeySpec(keyBytes); </code><code>//指定加密算法</code>
<code> </code><code>KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); </code><code>//取公鑰匙對象</code>
<code> </code><code>PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);</code>
<code> </code>
<code> </code><code>signature.initVerify(publicKey2);</code>
<code> </code><code>signature.update(data); </code><code>//驗證簽名是否正常</code>
<code> </code><code>return</code> <code>signature.verify(decryptBASE64(sign));</code>
本文轉自建波李 51CTO部落格,原文連結:http://blog.51cto.com/jianboli/1887611,如需轉載請自行聯系原作者