java-信息安全(十)-数字签名算法DSA
生活随笔
收集整理的這篇文章主要介紹了
java-信息安全(十)-数字签名算法DSA
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
信息安全基本概念:
- DSA算法(Digital Signature Algorithm,數據簽名算法)
DSA
Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSfS(DigitalSignature Standard)。
簡單的說,這是一種更高級的驗證方式,用作數字簽名。不單單只有公鑰、私鑰,還有數字簽名。私鑰加密生成數字簽名,公鑰驗證數據及簽名。如果數據和簽名不匹配則認為驗證失敗!數字簽名的作用就是校驗數據在傳輸過程中不被修改。數字簽名,是單向加密的升級!
算法分類
| 算法 | 密鑰長度 | 默認長度 | 簽名長度 | 實現的方 |
| SHA1withDSA | 512-65536 (64的整數倍) | 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.執行簽名 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.驗證簽名 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("驗證:"+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數字簽名組件* * @author 木子旭* @since 2017年3月17日上午10:37:30* @version %I%,%G%*/ public class DSACoder {public static final String ALGORITHM = "DSA";/*** 默認密鑰字節數* * <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;/*** 默認種子*/private static final String DEFAULT_SEED = "0f22507a10bbddd07d8a3082122966e3";private static final String PUBLIC_KEY = "DSAPublicKey";private static final String PRIVATE_KEY = "DSAPrivateKey";/*** 用私鑰對信息生成數字簽名* * @param data* 加密數據* @param privateKey* 私鑰* * @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64編碼的私鑰byte[] keyBytes = decryptBASE64(privateKey);// 構造PKCS8EncodedKeySpec對象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取私鑰匙對象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私鑰對信息生成數字簽名Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}/*** 校驗數字簽名* * @param data* 加密數據* @param publicKey* 公鑰* @param sign* 數字簽名* * @return 校驗成功返回true 失敗返回false* @throws Exception* */public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64編碼的公鑰byte[] keyBytes = decryptBASE64(publicKey);// 構造X509EncodedKeySpec對象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取公鑰匙對象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initVerify(pubKey);signature.update(data);// 驗證簽名是否正常return signature.verify(decryptBASE64(sign));}/*** 生成密鑰* * @param seed* 種子* @return 密鑰對象* @throws Exception*/public static Map<String, Object> initKey(String seed) throws Exception {KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);// 初始化隨機產生器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;}/*** 默認生成密鑰* * @return 密鑰對象* @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));} }測試代碼
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();// 構建密鑰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);// 產生簽名String sign = DSACoder.sign(data, privateKey);System.err.println("簽名:\r" + sign);// 驗證簽名boolean status = DSACoder.verify(data, publicKey, sign);System.err.println("狀態:\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== 狀態: true?參考地址:
http://snowolf.iteye.com/blog/382749
DSA算法?
總結
以上是生活随笔為你收集整理的java-信息安全(十)-数字签名算法DSA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: percona-toolkit之pt-k
- 下一篇: sourceInsight4 破解笔记(