1、DSA概述
为了确保数据传输的安全性,不得不采起一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。其中数字签名就是实现网上交易安全的核心技术之一,它能够保证信息传输的保密性、数据交换的完整性、发送信息的不能否认性、交易者身份的肯定性等。html
有关数据类型和数据转换处理请参考上海尚学堂如下两篇文章《数据类型及其转换》、《ajax+json数据处理》html5
DSA(Digital Signature Algorithm,数字签名算法,用做数字签名标准的一部分),它是另外一种公开密钥算法,它不能用做加密,只用做数字签名。DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去肯定签名和所签数据的真实性。DSA算法的安全性基于解离散对数的困难性,这类签字标准具备较大的兼容性和适用性,成为网络安全体系的基本构件之一。java
数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所做的密码变换,这种数据和变换容许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。 数字签名是经过一个单向函数对要传送的信息进行处理获得的用以认证信息来源并核实信息在传送过程当中是否发生变化的一个字母数字串。数字签名提供了对信息来源的肯定并能检测信息是否被篡改。git
2、DSA原理ajax
处理过程: (采用双重加密)
(1)使用SHA编码将发送文件加密产生128bit的数字摘要;
(2)发送方用本身的专用密钥对摘要再加密,造成数字签名;
(3)将原文和加密的摘要同时传给对方;
(4)接受方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生同一摘要;
(5)将解密后的摘要和收到的文件在接受方从新加密产生的摘要相互对比,若是二者一致,则说明在传送过程当中信息没有破坏和篡改。不然,则说明信息已经失去安全性和保密性。算法
3、JDK中对于DSA的实现
一、KeyPairGeneratorjson
KeyPairGenerator 类用于生成公钥和私钥对。密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的。
特定算法的密钥对生成器能够建立可以与此算法一块儿使用的公钥/私钥对。它还能够将特定于算法的参数与每一个生成的密钥关联。
有两种生成密钥对的方式:与算法无关的方式和特定于算法的方式。安全
下面咱们将按照指定RSA算法去生成秘钥KeyPairGenerator.getInstance("RSA");网络
二、DSAPublicKey
DSA 公用密钥的接口函数
三、DSAPublicKey
DSA 专用密钥的接口
四、PKCS8EncodedKeySpec
PKCS8EncodedKeySpec类继承EncodedKeySpec类,以编码格式来表示私钥。
PKCS8EncodedKeySpec类使用PKCS#8标准做为密钥规范管理的编码格式
五、Signature
Signature 类用来为应用程序提供数字签名算法功能。数字签名用于确保数字数据的验证和完整性。
在全部算法当中,数字签名能够是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。能够将使用 SHA-1 消息摘要算法的 DSA 算法指定为 SHA1withDSA。
4、实现
其中DSA的实现步骤相似于咱们以前学习的RSA数字签名算法.
实现步骤
第一步:初始化化秘钥组,生成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(); } }
}
5、DSA算法特色一、DSA是以RSA为基础造成的二、java6提供了DSA的实现,可是java6只提供了SHA1withDSA的实现三、bouncycastle扩展提供了其余的DSA实现方式四、遵循“私钥签名,公钥验证”的原则