- cer文件:
用于存储公钥证书的文件格式 - 对称加密/非对称加密
对称加密:使用一个密钥加密,使用同一个密钥解密,算法相同
非对称加密:又称公开密钥加密,加密和解密使用不同的密钥算法 - Base64编码
用于传输8Bit字节码的编码方式,可用于在HTTP环境下传递较长的标识信息 - 数字证书
采用公钥体制,利用一对互相匹配的密钥进行加密、解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私钥才能解密,公钥加密 - 公钥/私钥:不对称加密方式
1.数据加密,防止传输过程中被看到
2.保证数据来源,防止冒充
公钥:给大家用的,可发布给别人,让别人下载,其作用是用来加密/验章的
私钥:属于自己的,不可公开,其作用是解密/签章
每一个密钥的加密算法都是不同的
公钥加密的内容只能私钥解密,私钥加密的内容只能公钥解密 - 加签/验签
/**
* 加签名
* @param dataString
* @return
*/
public String signWhithsha1withrsa(String dataString) {
String signatureString = null;
// pfx文件路径
String filePath=rootPath+PFXPATH;
try {
// 表示密钥和证书的存储设施-密钥库
// PKCS12 一种交换数字证书的加密标准
// 获取指定 PKCS12 类型的
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(filePath);
char[] nPassword = null;
if (StringUtil.isEmpty(KEYSTORE_PASSWORD)) {
nPassword = null;
} else {
nPassword = KEYSTORE_PASSWORD.toCharArray();
}
// 从指定输入流中加载 KeyStore
ks.load(fis, nPassword);
fis.close();
System.out.println("keystore type=" + ks.getType());
// 获取密钥库的所有别名
Enumeration<String> enums = ks.aliases();
String keyAlias = null;
// 测试此枚举是否包含更多的元素
if (enums.hasMoreElements())
{
// 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素
keyAlias = (String) enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
}
// 判断给定别名是否通过调用 setKeyEntry
// 或者以 privateKeyEntry 或 SecretKeyEntry 为参数 setEntry 创建的
System.out.println("is key entry=" + ks.isKeyEntry(keyAlias));
// 获取和别名绑定的密钥,并用给定密码来恢复它
PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);
// 获取和别名绑定的证书
// Certificate / 管理各种身份证书
// 身份证书是一个主体与由另一个主体所担保的公钥之间的绑定关系
java.security.cert.Certificate cert = ks.getCertificate(keyAlias);
// 从证书中获取公钥
PublicKey pubkey = cert.getPublicKey();
// 获取证书名
System.out.println("cert class = " + cert.getClass().getName());
System.out.println("cert = " + cert);
System.out.println("-----------------公钥--------------------");
System.out.println("public key = " + pubkey);
System.out.println(new String(Base64.encodeBase64(pubkey.getEncoded())));
System.out.println("-----------------公钥--------------------");
System.out.println("-----------------私钥--------------------");
System.out.println("private key = " + prikey);
System.out.println(new String(Base64.encodeBase64(prikey.getEncoded())));
System.out.println("-----------------私钥--------------------");
// SHA1withRSA算法进行签名
// 三种算法签名:MD2withRSA、MD5withRSA、SHA1withRSA
// Signature - 用于提供数字签名算法功能
Signature sign = Signature.getInstance("SHA1withRSA");
// 使用私钥初始化签名
sign.initSign(prikey);
byte[] dataBase= Base64.encodeBase64(dataString.getBytes());
// 使用指定byte[]数组更新要签名或验证的数据
sign.update(dataBase);
// 返回已更新数据的签名byte[]数组
byte[] signature = sign.sign();
signatureString = new String(Base64.encodeBase64(signature));
System.out.println("--------signature is : " + signatureString);
} catch (Exception e) {
e.printStackTrace();
}
return signatureString;
}
/**
* 读取cer并验证公钥签名
*/
public Boolean readCerAndVerifySign(String requsetBody, String signature) {
String filePath=rootPath+CERPATH;
X509Certificate cert = null;
boolean flag = false;
try {
// CertificateFactory 用于从相关的编码中生成证书、证书路径、证书撤销列表对象
// X.509 的 CertificateFactory 返回的证书必须是 java.security.cert.X509Certificate 的实例
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// 从指定流中获取数据并生成证书
cert = (X509Certificate) cf
.generateCertificate(new FileInputStream(new File(
filePath)));
// 获取公钥
PublicKey publicKey = cert.getPublicKey();
String publicKeyString = new String(Base64.encodeBase64(publicKey
.getEncoded()));
System.out.println("-----------------公钥--------------------");
System.out.println(publicKeyString);
System.out.println("-----------------公钥--------------------");
// 签名算法
Signature verifySign = Signature.getInstance("SHA1withRSA");
// 使用给定证书的公钥初始化签名对象
verifySign.initVerify(publicKey);
// 用于验签的数据
verifySign.update(requsetBody.getBytes());
// 将获得的签名数据合公钥加签后的数据验证,获得验证则true,否则false
flag = verifySign.verify(Base64.decodeBase64(signature));
System.out.println("verifySign is " + flag);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return flag;
}