今天來點實際工做中的硬通貨!
與計費系統打交道,少不了用到加密/解密實現。爲了安全起見,經過非對稱加密交換對稱加密密鑰更是不可或缺。那麼須要經過什麼載體傳遞非對稱算法公鑰/私鑰信息?數字證書是公鑰的載體,而密鑰庫能夠包含公鑰、私鑰信息。
JKS和
PKCS#12都是比較經常使用的兩種密鑰庫格式/標準。對於前者,搞Java開發,尤爲是接觸過HTTPS平臺的朋友,並不陌生。
JKS文件(一般爲*.jks或*.keystore,擴展名無關)能夠經過Java原生工具——KeyTool生成;然後者
PKCS#12文件(一般爲*.p12或*.pfx,意味我的信息交換文件),則是經過更爲經常使用的OpenSSL工具產生。
固然,這二者之間是能夠經過導入/導出的方式進行轉換的!固然,這種轉換須要經過KeyTool工具進行!
迴歸正題,計費同事遇到一個難題:合做方交給他們一個*.pfx文件,須要他們從中提取密鑰,而後進行加密交互。其實,經過Java直接操做密鑰庫文件(或我的信息交換文件)對於通常Java開發人員來講,這都是個冷門。不接觸數字安全,根本不知所云。何況,Java原生的密鑰庫文件格式爲JKS,如何操做*.pfx文件?密鑰庫操做須要獲知密鑰庫別名,*.pfx別名是什麼?!接下來就解決這些問題!
方案:
- 經過keytool密鑰庫導入命令importkeystore,將密鑰庫格式由PKCS#12轉換爲JKS。
- 檢索新生成的密鑰庫文件,提取別名信息。
- 由密鑰庫文件導出數字證書(這裏將用到別名)。
- 經過代碼提取公鑰/私鑰、簽名算法等
先看格式轉換:
- echo 格式轉換
- keytool -importkeystore -v -srckeystore zlex.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore zlex.keystore -deststoretype jks -deststorepass 123456
echo 格式轉換
keytool -importkeystore -v -srckeystore zlex.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore zlex.keystore -deststoretype jks -deststorepass 123456
-importkeystore導入密鑰庫,經過格式設定,咱們能夠將PKCS#12文件轉換爲JKS格式。
-v顯示詳情
-srckeystore源密鑰庫,這裏是zlex.pfx
-srcstoretype源密鑰庫格式,這裏爲pkcs12
-srcstorepass源密鑰庫密碼,這裏爲123456
-destkeystore目標密鑰庫,這裏爲zlex.keystore
-deststoretype目標密鑰庫格式,這裏爲jks,默認值也如此
-deststorepass目標密鑰庫密碼,這裏爲123456
經過這個操做,咱們可以得到所需的密鑰庫文件zlex.keystore。
這時,咱們已經得到了密鑰庫文件,只要肯定對應的別名信息,就能夠提取公鑰/私鑰,以及數字證書,進行加密交互了!
- echo 查看證書
- keytool -list -keystore zlex.keystore -storepass 123456 -v
echo 查看證書
keytool -list -keystore zlex.keystore -storepass 123456 -v
-list列舉密鑰庫
-keystore密鑰庫,這裏是zlex.keystore
-storepass密鑰庫密碼,這裏是123456
-v顯示詳情
這裏須要細緻觀察一下別名信息!!!就是紅框中的數字1!!!
如今,咱們把證書導出!
- echo 導出證書
- keytool -exportcert -alias 1 -keystore zlex.keystore -file zlex.crt -storepass 123456
echo 導出證書
keytool -exportcert -alias 1 -keystore zlex.keystore -file zlex.crt -storepass 123456
-exportcert導出證書
-alias別名,這裏是1
-keystore密鑰庫,這裏是zlex.keystore
-file證書文件,這裏是zlex.crt
-storepass密鑰庫密碼,這裏是123456
如今證書也導出了,咱們能夠提取公鑰/私鑰,進行加密/解密,簽名/驗證操做了!固然,即使沒有證書,咱們也可以經過密鑰庫(JKS格式)文件得到證書,以及公鑰/私鑰、簽名算法等。
補充代碼, 其實就是對
Java加密技術(八)的修改!
- /**
- * 2010-8-11
- */
-
- import java.io.FileInputStream;
- import java.security.KeyStore;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.Signature;
- import java.security.cert.Certificate;
- import java.security.cert.CertificateFactory;
- import java.security.cert.X509Certificate;
- import java.util.Date;
-
- import javax.crypto.Cipher;
-
- /**
- * 證書操做類
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">樑棟</a>
- * @since 1.0
- */
- public class CertificateCoder {
- /**
- * Java密鑰庫(Java Key Store,JKS)KEY_STORE
- */
- public static final String KEY_STORE = "JKS";
-
- public static final String X509 = "X.509";
-
- /**
- * 由 KeyStore得到私鑰
- *
- * @param keyStorePath
- * @param keyStorePassword
- * @param alias
- * @param aliasPassword
- * @return
- * @throws Exception
- */
- private static PrivateKey getPrivateKey(String keyStorePath,
- String keyStorePassword, String alias, String aliasPassword)
- throws Exception {
- KeyStore ks = getKeyStore(keyStorePath, keyStorePassword);
- PrivateKey key = (PrivateKey) ks.getKey(alias,
- aliasPassword.toCharArray());
- return key;
- }
-
- /**
- * 由 Certificate得到公鑰
- *
- * @param certificatePath
- * @return
- * @throws Exception
- */
- private static PublicKey getPublicKey(String certificatePath)
- throws Exception {
- Certificate certificate = getCertificate(certificatePath);
- PublicKey key = certificate.getPublicKey();
- return key;
- }
-
- /**
- * 得到Certificate
- *
- * @param certificatePath
- * @return
- * @throws Exception
- */
- private static Certificate getCertificate(String certificatePath)
- throws Exception {
- CertificateFactory certificateFactory = CertificateFactory
- .getInstance(X509);
- FileInputStream in = new FileInputStream(certificatePath);
-
- Certificate certificate = certificateFactory.generateCertificate(in);
- in.close();
-
- return certificate;
- }
-
- /**
- * 得到Certificate
- *
- * @param keyStorePath
- * @param keyStorePassword
- * @param alias
- * @return
- * @throws Exception
- */
- private static Certificate getCertificate(String keyStorePath,
- String keyStorePassword, String alias) throws Exception {
- KeyStore ks = getKeyStore(keyStorePath, keyStorePassword);
- Certificate certificate = ks.getCertificate(alias);
-
- return certificate;
- }
-
- /**
- * 得到KeyStore
- *
- * @param keyStorePath
- * @param password
- * @return
- * @throws Exception
- */
- private static KeyStore getKeyStore(String keyStorePath, String password)
- throws Exception {
- FileInputStream is = new FileInputStream(keyStorePath);
- KeyStore ks = KeyStore.getInstance(KEY_STORE);
- ks.load(is, password.toCharArray());
- is.close();
- return ks;
- }
-
- /**
- * 私鑰加密
- *
- * @param data
- * @param keyStorePath
- * @param keyStorePassword
- * @param alias
- * @param aliasPassword
- * @return
- * @throws Exception
- */
- public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath,
- String keyStorePassword, String alias, String aliasPassword)
- throws Exception {
- // 取得私鑰
- PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
- alias, aliasPassword);
-
- // 對數據加密
- Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
- cipher.init(Cipher.ENCRYPT_MODE, privateKey);
-
- return cipher.doFinal(data);
-
- }
-
- /**
- * 私鑰解密
- *
- * @param data
- * @param keyStorePath
- * @param alias
- * @param keyStorePassword
- * @param aliasPassword
- * @return
- * @throws Exception
- */
- public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath,
- String alias, String keyStorePassword, String aliasPassword)
- throws Exception {
- // 取得私鑰
- PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
- alias, aliasPassword);
-
- // 對數據加密
- Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
- cipher.init(Cipher.DECRYPT_MODE, privateKey);
-
- return cipher.doFinal(data);
-
- }
-
- /**
- * 公鑰加密
- *
- * @param data
- * @param certificatePath
- * @return
- * @throws Exception
- */
- public static byte[] encryptByPublicKey(byte[] data, String certificatePath)
- throws Exception {
-
- // 取得公鑰
- PublicKey publicKey = getPublicKey(certificatePath);
- // 對數據加密
- Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
-
- return cipher.doFinal(data);
-
- }
-
- /**
- * 公鑰解密
- *
- * @param data
- * @param certificatePath
- * @return
- * @throws Exception
- */
- public static byte[] decryptByPublicKey(byte[] data, String certificatePath)
- throws Exception {
- // 取得公鑰
- PublicKey publicKey = getPublicKey(certificatePath);
-
- // 對數據加密
- Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
- cipher.init(Cipher.DECRYPT_MODE, publicKey);
-
- return cipher.doFinal(data);
-
- }
-
- /**
- * 驗證Certificate
- *
- * @param certificatePath
- * @return
- */
- public static boolean verifyCertificate(String certificatePath) {
- return verifyCertificate(new Date(), certificatePath);
- }
-
- /**
- * 驗證Certificate是否過時或無效
- *
- * @param date
- * @param certificatePath
- * @return
- */
- public static boolean verifyCertificate(Date date, String certificatePath) {
- boolean status = true;
- try {
- // 取得證書
- Certificate certificate = getCertificate(certificatePath);
- // 驗證證書是否過時或無效
- status = verifyCertificate(date, certificate);
- } catch (Exception e) {
- status = false;
- }
- return status;
- }
-
- /**
- * 驗證證書是否過時或無效
- *
- * @param date
- * @param certificate
- * @return
- */
- private static boolean verifyCertificate(Date date, Certificate certificate) {
- boolean status = true;
- try {
- X509Certificate x509Certificate = (X509Certificate) certificate;
- x509Certificate.checkValidity(date);
- } catch (Exception e) {
- status = false;
- }
- return status;
- }
-
- /**
- * 簽名
- *
- * @param keyStorePath
- * @param alias
- * @param keyStorePassword
- * @param aliasPassword
- * @return
- * @throws Exception
- */
- public static byte[] sign(byte[] sign, String keyStorePath, String alias,
- String keyStorePassword, String aliasPassword) throws Exception {
- // 得到證書
- X509Certificate x509Certificate = (X509Certificate) getCertificate(
- keyStorePath, keyStorePassword, alias);
-
- // 取得私鑰
- PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
- alias, aliasPassword);
-
- // 構建簽名
- Signature signature = Signature.getInstance(x509Certificate
- .getSigAlgName());
- signature.initSign(privateKey);
- signature.update(sign);
- return signature.sign();
- }
-
- /**
- * 驗證簽名
- *
- * @param data
- * @param sign
- * @param certificatePath
- * @return
- * @throws Exception
- */
- public static boolean verify(byte[] data, byte[] sign,
- String certificatePath) throws Exception {
- // 得到證書
- X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
- // 得到公鑰
- PublicKey publicKey = x509Certificate.getPublicKey();
- // 構建簽名
- Signature signature = Signature.getInstance(x509Certificate
- .getSigAlgName());
- signature.initVerify(publicKey);
- signature.update(data);
-
- return signature.verify(sign);
-
- }
-
- /**
- * 驗證Certificate
- *
- * @param keyStorePath
- * @param keyStorePassword
- * @param alias
- * @return
- */
- public static boolean verifyCertificate(Date date, String keyStorePath,
- String keyStorePassword, String alias) {
- boolean status = true;
- try {
- Certificate certificate = getCertificate(keyStorePath,
- keyStorePassword, alias);
- status = verifyCertificate(date, certificate);
- } catch (Exception e) {
- status = false;
- }
- return status;
- }
-
- /**
- * 驗證Certificate
- *
- * @param keyStorePath
- * @param keyStorePassword
- * @param alias
- * @return
- */
- public static boolean verifyCertificate(String keyStorePath,
- String keyStorePassword, String alias) {
- return verifyCertificate(new Date(), keyStorePath, keyStorePassword,
- alias);
- }
- }
/**
* 2010-8-11
*/
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.crypto.Cipher;
/**
* 證書操做類
*
* @author <a href="mailto:zlex.dongliang@gmail.com">樑棟</a>
* @since 1.0
*/
public class CertificateCoder {
/**
* Java密鑰庫(Java Key Store,JKS)KEY_STORE
*/
public static final String KEY_STORE = "JKS";
public static final String X509 = "X.509";
/**
* 由 KeyStore得到私鑰
*
* @param keyStorePath
* @param keyStorePassword
* @param alias
* @param aliasPassword
* @return
* @throws Exception
*/
private static PrivateKey getPrivateKey(String keyStorePath,
String keyStorePassword, String alias, String aliasPassword)
throws Exception {
KeyStore ks = getKeyStore(keyStorePath, keyStorePassword);
PrivateKey key = (PrivateKey) ks.getKey(alias,
aliasPassword.toCharArray());
return key;
}
/**
* 由 Certificate得到公鑰
*
* @param certificatePath
* @return
* @throws Exception
*/
private static PublicKey getPublicKey(String certificatePath)
throws Exception {
Certificate certificate = getCertificate(certificatePath);
PublicKey key = certificate.getPublicKey();
return key;
}
/**
* 得到Certificate
*
* @param certificatePath
* @return
* @throws Exception
*/
private static Certificate getCertificate(String certificatePath)
throws Exception {
CertificateFactory certificateFactory = CertificateFactory
.getInstance(X509);
FileInputStream in = new FileInputStream(certificatePath);
Certificate certificate = certificateFactory.generateCertificate(in);
in.close();
return certificate;
}
/**
* 得到Certificate
*
* @param keyStorePath
* @param keyStorePassword
* @param alias
* @return
* @throws Exception
*/
private static Certificate getCertificate(String keyStorePath,
String keyStorePassword, String alias) throws Exception {
KeyStore ks = getKeyStore(keyStorePath, keyStorePassword);
Certificate certificate = ks.getCertificate(alias);
return certificate;
}
/**
* 得到KeyStore
*
* @param keyStorePath
* @param password
* @return
* @throws Exception
*/
private static KeyStore getKeyStore(String keyStorePath, String password)
throws Exception {
FileInputStream is = new FileInputStream(keyStorePath);
KeyStore ks = KeyStore.getInstance(KEY_STORE);
ks.load(is, password.toCharArray());
is.close();
return ks;
}
/**
* 私鑰加密
*
* @param data
* @param keyStorePath
* @param keyStorePassword
* @param alias
* @param aliasPassword
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath,
String keyStorePassword, String alias, String aliasPassword)
throws Exception {
// 取得私鑰
PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
alias, aliasPassword);
// 對數據加密
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 私鑰解密
*
* @param data
* @param keyStorePath
* @param alias
* @param keyStorePassword
* @param aliasPassword
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath,
String alias, String keyStorePassword, String aliasPassword)
throws Exception {
// 取得私鑰
PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
alias, aliasPassword);
// 對數據加密
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 公鑰加密
*
* @param data
* @param certificatePath
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String certificatePath)
throws Exception {
// 取得公鑰
PublicKey publicKey = getPublicKey(certificatePath);
// 對數據加密
Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 公鑰解密
*
* @param data
* @param certificatePath
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String certificatePath)
throws Exception {
// 取得公鑰
PublicKey publicKey = getPublicKey(certificatePath);
// 對數據加密
Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 驗證Certificate
*
* @param certificatePath
* @return
*/
public static boolean verifyCertificate(String certificatePath) {
return verifyCertificate(new Date(), certificatePath);
}
/**
* 驗證Certificate是否過時或無效
*
* @param date
* @param certificatePath
* @return
*/
public static boolean verifyCertificate(Date date, String certificatePath) {
boolean status = true;
try {
// 取得證書
Certificate certificate = getCertificate(certificatePath);
// 驗證證書是否過時或無效
status = verifyCertificate(date, certificate);
} catch (Exception e) {
status = false;
}
return status;
}
/**
* 驗證證書是否過時或無效
*
* @param date
* @param certificate
* @return
*/
private static boolean verifyCertificate(Date date, Certificate certificate) {
boolean status = true;
try {
X509Certificate x509Certificate = (X509Certificate) certificate;
x509Certificate.checkValidity(date);
} catch (Exception e) {
status = false;
}
return status;
}
/**
* 簽名
*
* @param keyStorePath
* @param alias
* @param keyStorePassword
* @param aliasPassword
* @return
* @throws Exception
*/
public static byte[] sign(byte[] sign, String keyStorePath, String alias,
String keyStorePassword, String aliasPassword) throws Exception {
// 得到證書
X509Certificate x509Certificate = (X509Certificate) getCertificate(
keyStorePath, keyStorePassword, alias);
// 取得私鑰
PrivateKey privateKey = getPrivateKey(keyStorePath, keyStorePassword,
alias, aliasPassword);
// 構建簽名
Signature signature = Signature.getInstance(x509Certificate
.getSigAlgName());
signature.initSign(privateKey);
signature.update(sign);
return signature.sign();
}
/**
* 驗證簽名
*
* @param data
* @param sign
* @param certificatePath
* @return
* @throws Exception
*/
public static boolean verify(byte[] data, byte[] sign,
String certificatePath) throws Exception {
// 得到證書
X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
// 得到公鑰
PublicKey publicKey = x509Certificate.getPublicKey();
// 構建簽名
Signature signature = Signature.getInstance(x509Certificate
.getSigAlgName());
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sign);
}
/**
* 驗證Certificate
*
* @param keyStorePath
* @param keyStorePassword
* @param alias
* @return
*/
public static boolean verifyCertificate(Date date, String keyStorePath,
String keyStorePassword, String alias) {
boolean status = true;
try {
Certificate certificate = getCertificate(keyStorePath,
keyStorePassword, alias);
status = verifyCertificate(date, certificate);
} catch (Exception e) {
status = false;
}
return status;
}
/**
* 驗證Certificate
*
* @param keyStorePath
* @param keyStorePassword
* @param alias
* @return
*/
public static boolean verifyCertificate(String keyStorePath,
String keyStorePassword, String alias) {
return verifyCertificate(new Date(), keyStorePath, keyStorePassword,
alias);
}
}
相信上述代碼已經幫朋友們解決了至關多的問題!
給出測試類:
- import static org.junit.Assert.*;
-
- import java.util.Date;
-
- import org.apache.commons.codec.binary.Hex;
- import org.junit.Test;
-
- /**
- * 證書操做驗證類
- *
- * @author <a href="mailto:zlex.dongliang@gmail.com">樑棟</a>
- * @version 1.0
- * @since 1.0
- */
- public class CertificateCoderTest {
- private String certificatePath = "zlex.crt";
- private String keyStorePath = "zlex.keystore";
- private String keyStorePassword = "123456";
- private String aliasPassword = "123456";
- private String alias = "1";
-
- @Test
- public void test() throws Exception {
- System.err.println("公鑰加密——私鑰解密");
- String inputStr = "Ceritifcate";
- byte[] data = inputStr.getBytes();
-
- byte[] encrypt = CertificateCoder.encryptByPublicKey(data,
- certificatePath);
-
- byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt,
- keyStorePath, alias, keyStorePassword, aliasPassword);
- String outputStr = new String(decrypt);
-
- System.err.println("加密前: " + inputStr + "\n\r" + "解密後: " + outputStr);
-
- // 驗證數據一致
- assertArrayEquals(data, decrypt);
-
- // 驗證證書有效
- assertTrue(CertificateCoder.verifyCertificate(certificatePath));
-
- }
-
- @Test
- public void testSign() throws Exception {
- System.err.println("私鑰加密——公鑰解密");
-
- String inputStr = "sign";
- byte[] data = inputStr.getBytes();
-
- byte[] encodedData = CertificateCoder.encryptByPrivateKey(data,
- keyStorePath, keyStorePassword, alias, aliasPassword);
-
- byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData,
- certificatePath);
-
- String outputStr = new String(decodedData);
- System.err.println("加密前: " + inputStr + "\n\r" + "解密後: " + outputStr);
- assertEquals(inputStr, outputStr);
-
- System.err.println("私鑰簽名——公鑰驗證簽名");
- // 產生簽名
- byte[] sign = CertificateCoder.sign(encodedData, keyStorePath, alias,
- keyStorePassword, aliasPassword);
- System.err.println("簽名:\r" + Hex.encodeHexString(sign));
-
- // 驗證簽名
- boolean status = CertificateCoder.verify(encodedData, sign,
- certificatePath);
- System.err.println("狀態:\r" + status);
- assertTrue(status);
- }
-
- @Test
- public void testVerify() throws Exception {
- System.err.println("密鑰庫證書有效期驗證");
- boolean status = CertificateCoder.verifyCertificate(new Date(),
- keyStorePath, keyStorePassword, alias);
- System.err.println("證書狀態:\r" + status);
- assertTrue(status);
- }
- }
import static org.junit.Assert.*;
import java.util.Date;
import org.apache.commons.codec.binary.Hex;
import org.junit.Test;
/**
* 證書操做驗證類
*
* @author <a href="mailto:zlex.dongliang@gmail.com">樑棟</a>
* @version 1.0
* @since 1.0
*/
public class CertificateCoderTest {
private String certificatePath = "zlex.crt";
private String keyStorePath = "zlex.keystore";
private String keyStorePassword = "123456";
private String aliasPassword = "123456";
private String alias = "1";
@Test
public void test() throws Exception {
System.err.println("公鑰加密——私鑰解密");
String inputStr = "Ceritifcate";
byte[] data = inputStr.getBytes();
byte[] encrypt = CertificateCoder.encryptByPublicKey(data,
certificatePath);
byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt,
keyStorePath, alias, keyStorePassword, aliasPassword);
String outputStr = new String(decrypt);
System.err.println("加密前: " + inputStr + "\n\r" + "解密後: " + outputStr);
// 驗證數據一致
assertArrayEquals(data, decrypt);
// 驗證證書有效
assertTrue(CertificateCoder.verifyCertificate(certificatePath));
}
@Test
public void testSign() throws Exception {
System.err.println("私鑰加密——公鑰解密");
String inputStr = "sign";
byte[] data = inputStr.getBytes();
byte[] encodedData = CertificateCoder.encryptByPrivateKey(data,
keyStorePath, keyStorePassword, alias, aliasPassword);
byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData,
certificatePath);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "\n\r" + "解密後: " + outputStr);
assertEquals(inputStr, outputStr);
System.err.println("私鑰簽名——公鑰驗證簽名");
// 產生簽名
byte[] sign = CertificateCoder.sign(encodedData, keyStorePath, alias,
keyStorePassword, aliasPassword);
System.err.println("簽名:\r" + Hex.encodeHexString(sign));
// 驗證簽名
boolean status = CertificateCoder.verify(encodedData, sign,
certificatePath);
System.err.println("狀態:\r" + status);
assertTrue(status);
}
@Test
public void testVerify() throws Exception {
System.err.println("密鑰庫證書有效期驗證");
boolean status = CertificateCoder.verifyCertificate(new Date(),
keyStorePath, keyStorePassword, alias);
System.err.println("證書狀態:\r" + status);
assertTrue(status);
}
}
第一個測試方法,用於提取公鑰/私鑰進行加密/解密操做。
第二個測試方法,用於提取簽名算法進行簽名/驗證操做。
第三個測試方法,用於測試密鑰庫該別名對應的證書,當前日期下,是否有效。
OK,任務完成,密鑰成功提取,剩下的都是代碼基本功了!