日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java-信息安全(十)-数字签名算法DSA

發(fā)布時(shí)間:2025/4/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java-信息安全(十)-数字签名算法DSA 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

信息安全基本概念:

  • DSA算法(Digital Signature Algorithm,數(shù)據(jù)簽名算法)

DSA

  Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSfS(DigitalSignature Standard)。

  簡單的說,這是一種更高級(jí)的驗(yàn)證方式,用作數(shù)字簽名。不單單只有公鑰、私鑰,還有數(shù)字簽名。私鑰加密生成數(shù)字簽名,公鑰驗(yàn)證數(shù)據(jù)及簽名。如果數(shù)據(jù)和簽名不匹配則認(rèn)為驗(yàn)證失敗!數(shù)字簽名的作用就是校驗(yàn)數(shù)據(jù)在傳輸過程中不被修改。數(shù)字簽名,是單向加密的升級(jí)!

算法分類

算法密鑰長度默認(rèn)長度簽名長度實(shí)現(xiàn)的方
SHA1withDSA512-65536
(64的整數(shù)倍)
1024同密鑰JDK
SHA224withDSA同上1024同密鑰BC
SHA256withDSA...1024同密鑰BC
SHA384withDSA...1024同密鑰BC
SHA512withDSA...1024同密鑰BC

簽名示例

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.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; import sun.security.provider.DSAPrivateKey; import sun.security.provider.DSAPublicKey; public class DSA { private static String src = "dsa security"; public static void main(String[] args) { jdkDSA(); } public static void jdkDSA(){ try { //1.初始化密鑰 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); DSAPublicKey dsaPublicKey = (DSAPublicKey)keyPair.getPublic(); DSAPrivateKey dsaPrivateKey = (DSAPrivateKey)keyPair.getPrivate(); //2.執(zhí)行簽名 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("DSA"); PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance("SHA1withDSA"); signature.initSign(privateKey); signature.update(src.getBytes()); byte[] res = signature.sign(); System.out.println("簽名:"+HexBin.encode(res)); //3.驗(yàn)證簽名 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded()); keyFactory = KeyFactory.getInstance("DSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); signature = Signature.getInstance("SHA1withDSA"); signature.initVerify(publicKey); signature.update(src.getBytes()); boolean bool = signature.verify(res); System.out.println("驗(yàn)證:"+bool); } catch (Exception e) { e.printStackTrace(); } } }

示例代碼

package com.jd.order.util.encryption;import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; 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 java.util.HashMap; import java.util.Map;import org.apache.commons.codec.binary.Base64;/*** DSA數(shù)字簽名組件* * @author 木子旭* @since 2017年3月17日上午10:37:30* @version %I%,%G%*/ public class DSACoder {public static final String ALGORITHM = "DSA";/*** 默認(rèn)密鑰字節(jié)數(shù)* * <pre>* DSA * Default Keysize 1024 * Keysize must be a multiple of 64, ranging from 512 to 1024 (inclusive).* </pre>*/private static final int KEY_SIZE = 1024;/*** 默認(rèn)種子*/private static final String DEFAULT_SEED = "0f22507a10bbddd07d8a3082122966e3";private static final String PUBLIC_KEY = "DSAPublicKey";private static final String PRIVATE_KEY = "DSAPrivateKey";/*** 用私鑰對(duì)信息生成數(shù)字簽名* * @param data* 加密數(shù)據(jù)* @param privateKey* 私鑰* * @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64編碼的私鑰byte[] keyBytes = decryptBASE64(privateKey);// 構(gòu)造PKCS8EncodedKeySpec對(duì)象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取私鑰匙對(duì)象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私鑰對(duì)信息生成數(shù)字簽名Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}/*** 校驗(yàn)數(shù)字簽名* * @param data* 加密數(shù)據(jù)* @param publicKey* 公鑰* @param sign* 數(shù)字簽名* * @return 校驗(yàn)成功返回true 失敗返回false* @throws Exception* */public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64編碼的公鑰byte[] keyBytes = decryptBASE64(publicKey);// 構(gòu)造X509EncodedKeySpec對(duì)象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取公鑰匙對(duì)象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initVerify(pubKey);signature.update(data);// 驗(yàn)證簽名是否正常return signature.verify(decryptBASE64(sign));}/*** 生成密鑰* * @param seed* 種子* @return 密鑰對(duì)象* @throws Exception*/public static Map<String, Object> initKey(String seed) throws Exception {KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);// 初始化隨機(jī)產(chǎn)生器SecureRandom secureRandom = new SecureRandom();secureRandom.setSeed(seed.getBytes());keygen.initialize(KEY_SIZE, secureRandom);KeyPair keys = keygen.genKeyPair();DSAPublicKey publicKey = (DSAPublicKey) keys.getPublic();DSAPrivateKey privateKey = (DSAPrivateKey) keys.getPrivate();Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, publicKey);map.put(PRIVATE_KEY, privateKey);return map;}/*** 默認(rèn)生成密鑰* * @return 密鑰對(duì)象* @throws Exception*/public static Map<String, Object> initKey() throws Exception {return initKey(DEFAULT_SEED);}/*** 取得私鑰* * @param keyMap* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return encryptBASE64(key.getEncoded());}/*** 取得公鑰* * @param keyMap* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return encryptBASE64(key.getEncoded());}public static byte[] decryptBASE64(String data) {return Base64.decodeBase64(data);}public static String encryptBASE64(byte[] data) {return new String(Base64.encodeBase64(data));} }

測(cè)試代碼

package com.jd.order.util.encryption;import static org.junit.Assert.assertTrue;import java.util.Map;import org.junit.Test;public class DSACoderTest {@Testpublic void test() throws Exception {String inputStr = "abc";byte[] data = inputStr.getBytes();// 構(gòu)建密鑰Map<String, Object> keyMap = DSACoder.initKey();// 獲得密鑰String publicKey = DSACoder.getPublicKey(keyMap);String privateKey = DSACoder.getPrivateKey(keyMap);System.err.println("公鑰:\r" + publicKey);System.err.println("私鑰:\r" + privateKey);// 產(chǎn)生簽名String sign = DSACoder.sign(data, privateKey);System.err.println("簽名:\r" + sign);// 驗(yàn)證簽名boolean status = DSACoder.verify(data, publicKey, sign);System.err.println("狀態(tài):\r" + status);assertTrue(status);} }

輸出

公鑰: MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAIu4RUlcQLp49PI0MrbssOY+3uySVnp0TULSv5T4VaHoKzsLHgGTrwOvsGA+V3yCNl2WDu3D84bSLF7liTWgOj+SMOEaPk4VyRTlLXZWGPsf1Mfd921XAbMeVyKDSHHVGbMjBScajf3bXooYQMlyoHiOt/WrCo+mv7efstMM0PGo= 私鑰: MIIBTAIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoEFwIVAIegLUtmm2oQKQJTOiLugHTSjl/q 簽名: MCwCFGQHO9AO70cMxFTPeYqAwq7B7OFxAhRGC8A6YwFFZSfuVTAfleDof/yGug== 狀態(tài): true

?參考地址:

http://snowolf.iteye.com/blog/382749

DSA算法?

總結(jié)

以上是生活随笔為你收集整理的java-信息安全(十)-数字签名算法DSA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。