keystore提取私鑰和證書(重要×××)
2011-04-23 13:30:37|分類: HTTPS keytool |字型大小訂閱
( From:http://wangxuliangboy.javaeye.com/blog/382434)
keytool -genkey -alias test -keyalg RSA -keystore c:/key.store
生成keyStore
RSA是一個既能用於數據加密也能用於數字簽名的演算法。
DSA(Digital Signature Algorithm,數字簽名演算法,用作數字簽名標準的一部分),它是另一種公開密鑰演算法,它不能用作加密,只用作數字簽名。DSA使用公開密鑰,為接受者驗證數據的完整性和數據發送者的身份。
提取證書:
通過keytool命令我們可以很輕鬆的提取證書.
證書包括主體信息,公鑰.
keytool -export -alias 別名 -keystore 文件名 -file 證書名稱
但是我們無法通過KEYTOOL工具來提取私鑰的..我們只能通過java的KeyStore類getEntry() 或者getKey()來提取私鑰.
讀取keyStore文件:
char[] password = "password".toCharArray();
java.io.FileInputStream fis = new java.io.FileInputStream("c:/server/server_keystore");
// 從指定的輸入流中載入此 KeyStoreks.load(fis, password);//keystore 中的每一項都用「別名」字元串標識。
//使用指定保護參數獲取指定別名的 keystore Entry
。
//KeyStore.PrivateKeyEntry 保存 PrivateKey
和相應證書鏈的 KeyStore
項。
方法1. KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry( "keystore別名", new KeyStore.PasswordProtection( password));
// 返回與給定別名相關聯的密鑰
方法2. PrivateKey key = (PrivateKey) ks.getKey("ser", password);
怎麼來驗證提取的私鑰是否正確呢?(因為公鑰私鑰必須成對出現,我們可以通過證書提取去公鑰,然後用公鑰加密,使用剛剛獲得的私鑰解密)
提取證書的方法:
keytool -export -alias 別名 -keystore 文件名 -file 證書名稱
// 提取公鑰方法1:通過PrivateKeyEntry獲得證書,然後提取公鑰
Certificate c = pkEntry.getCertificate();PublicKey publicKey = c.getPublicKey();
// 提取公鑰方法2:通過證書流獲得證書,然後提取公鑰
CertificateFactory cf = CertificateFactory.getInstance("X.509"); FileInputStream in = new FileInputStream("C:\server\server.cer");
//生成一個證書對象並使用從輸入流 inStream
中讀取的數據對它進行初始化。 Certificate c = cf.generateCertificate(in);PublicKey publicKey = c.getPublicKey();
// 提取公鑰方法3:通過別名獲得證書,然後提取公鑰
Certificate c = ks.generateCertificate("ser"); // 通過別名來提取公鑰PublicKey publicKey = c.getPublicKey();
//通過下面這段代碼提取的私鑰是否正確
String before = "asdf";
byte[] plainText = before.getBytes("UTF-8");Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 用公鑰進行加密,返回一個位元組流 byte[] cipherText = cipher.doFinal(plainText); cipher.init(Cipher.DECRYPT_MODE, myPrivateKey); // 用私鑰進行解密,返回一個位元組流 byte[] newPlainText = cipher.doFinal(cipherText); System.out.println(new String(newPlainText, "UTF-8"));推薦閱讀:
※民國妓女申請書和保證書/組圖
※哪些證書是可以掛靠的?有哪些風險?
※夫妻各自偷情互相捉姦 妻子要老公寫保證書
※用「保證書」能制約丈夫嗎
※夫妻保證書