一、DSA概述
為了確保數據傳輸的安全性,不得不采取一系列的安全技術(shù),如加密技術(shù)、數字簽名、身份認證、密鑰管理、防火墻、安全協(xié)議等。其中數字簽名就是實(shí)現網(wǎng)上交易安全的核心技術(shù)之一,它可以保證信息傳輸的保密性、數據交換的完整性、發(fā)送信息的不可否認性、交易者身份的確定性等。
有關(guān)數據類(lèi)型和數據轉換處理請參考上海尚學(xué)堂以下兩篇文章《數據類(lèi)型及其轉換》、《ajax+json數據處理》
DSA(Digital Signature Algorithm,數字簽名算法,用作數字簽名標準的一部分),它是另一種公開(kāi)密鑰算法,它不能用作加密,只用作數字簽名。DSA使用公開(kāi)密鑰,為接受者驗證數據的完整性和數據發(fā)送者的身份。它也可用于由第三方去確定簽名和所簽數據的真實(shí)性。DSA算法的安全性基于解離散對數的困難性,這類(lèi)簽字標準具有較大的兼容性和適用性,成為網(wǎng)絡(luò )安全體系的基本構件之一。
數字簽名在ISO7498—2標準中定義為:“附加在數據單元上的一些數據,或是對數據單元所作的密碼變換,這種數據和變換允許數據單元的接收者用以確認數據單元來(lái)源和數據單元的完整性,并保護數據,防止被人(例如接收者)進(jìn)行偽造”。 數字簽名是通過(guò)一個(gè)單向函數對要傳送的信息進(jìn)行處理得到的用以認證信息來(lái)源并核實(shí)信息在傳送過(guò)程中是否發(fā)生變化的一個(gè)字母數字串。數字簽名提供了對信息來(lái)源的確定并能檢測信息是否被篡改。
二、DSA原理
處理過(guò)程: (采用雙重加密)
(1)使用SHA編碼將發(fā)送文件加密產(chǎn)生128bit的數字摘要;
(2)發(fā)送方用自己的專(zhuān)用密鑰對摘要再加密,形成數字簽名;
(3)將原文和加密的摘要同時(shí)傳給對方;
(4)接受方用發(fā)送方的公共密鑰對摘要解密,同時(shí)對收到的文件用SHA編碼加密產(chǎn)生同一摘要;
(5)將解密后的摘要和收到的文件在接受方重新加密產(chǎn)生的摘要相互對比,如果兩者一致,則說(shuō)明在傳送過(guò)程中信息沒(méi)有破壞和篡改。否則,則說(shuō)明信息已經(jīng)失去安全性和保密性。
三、JDK中對于DSA的實(shí)現
1、KeyPairGenerator
KeyPairGenerator 類(lèi)用于生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠(chǎng)方法(返回一個(gè)給定類(lèi)的實(shí)例的靜態(tài)方法)構造的。 特定算法的密鑰對生成器可以創(chuàng )建能夠與此算法一起使用的公鑰/私鑰對。它還可以將特定于算法的參數與每個(gè)生成的密鑰關(guān)聯(lián)。
有兩種生成密鑰對的方式:與算法無(wú)關(guān)的方式和特定于算法的方式。
下面我們將按照指定RSA算法去生成秘鑰KeyPairGenerator.getInstance("RSA");
2、DSAPublicKey
DSA 公用密鑰的接口
3、DSAPublicKey
DSA 專(zhuān)用密鑰的接口
4、PKCS8EncodedKeySpec
PKCS8EncodedKeySpec類(lèi)繼承EncodedKeySpec類(lèi),以編碼格式來(lái)表示私鑰。
PKCS8EncodedKeySpec類(lèi)使用PKCS#8標準作為密鑰規范管理的編碼格式
5、Signature
Signature 類(lèi)用來(lái)為應用程序提供數字簽名算法功能。數字簽名用于確保數字數據的驗證和完整性。
在所有算法當中,數字簽名可以是 NIST 標準的 DSA,它使用 DSA 和 SHA-1??梢詫⑹褂?SHA-1 消息摘要算法的 DSA 算法指定為 SHA1withDSA。
四、實(shí)現
其中DSA的實(shí)現步驟類(lèi)似于我們之前學(xué)習的RSA數字簽名算法.
實(shí)現步驟
第一步:初始化化秘鑰組,生成DSA算法的公鑰和私鑰第二步:執行私鑰簽名, 使用私鑰簽名,生成私鑰簽名第三步:執行公鑰簽名,生成公鑰簽名第四步:使用公鑰驗證私鑰簽名備注:所謂的公鑰與私鑰匙成對出現。 遵從的原則就是“私鑰簽名、公鑰驗證”。
示例代碼如下:
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.xml.bind.DatatypeConverter;
public class DSAUtil {
private static String src = "hello";public static void main(String[] args) { jdkDSA();}public static void jdkDSA() { // 1. 初始化 秘鑰 try { KeyPairGenerator generator = KeyPairGenerator.getInstance("DSA"); generator.initialize(512); KeyPair keyPair = generator.generateKeyPair(); DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic(); DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate(); // 2。 執行簽名 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded()); KeyFactory factory = KeyFactory.getInstance("DSA"); PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance("SHA1withDSA"); signature.initSign(privateKey); signature.update(src.getBytes()); byte[] sign = signature.sign();System.out.println(DatatypeConverter.printHexBinary(sign)); // 驗證簽名 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded()); factory = KeyFactory.getInstance("DSA"); PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec); signature = Signature.getInstance("SHA1withDSA"); signature.initVerify(publicKey); signature.update(src.getBytes()); boolean verify = signature.verify(sign); System.out.println(verify); } catch (Exception e) { e.printStackTrace(); }}}
五、DSA算法特點(diǎn)
1、DSA是以RSA為基礎形成的
2、java6提供了DSA的實(shí)現,但是java6只提供了SHA1withDSA的實(shí)現
3、bouncycastle擴展提供了其他的DSA實(shí)現方式
4、遵循“私鑰簽名,公鑰驗證”的原則
聯(lián)系客服