国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java讀取OpenSSL生成的PEM公鑰文件操作

瀏覽:2日期:2022-08-23 11:41:49

JDK8的JCE是不支持讀取PEM文件的。需要使用bouncycastle。

項目需求,使用SHA1WithRSA算法,對接口數(shù)據(jù)做簽名。

代碼如下:

@Serviceclass SignService { private static Logger LOG = LoggerFactory.getLogger(SignService.class); @Autowired private Config config; private Signature signature; @PostConstruct private void init() { try { PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( getDecoder().decode(config.getPrivateKey().getBytes(ISO_8859_1))); KeyFactory factory = KeyFactory.getInstance('RSA'); PrivateKey privateKey = factory.generatePrivate(priKeySpec); signature = Signature.getInstance('SHA1WithRSA'); signature.initSign(privateKey); } catch (NoSuchAlgorithmException | /*InvalidAlgorithmParameterException |*/ InvalidKeySpecException | InvalidKeyException ex) { LOG.warn('RSA init error: {}.', ex); } } String signAndEncode(String source) { if (Objects.isNull(source)) { return null; } else { return sign(source) .map(this::encode) .orElse(''); } } private String encode(byte[] source) { return getEncoder() .encodeToString(source); } private synchronized Optional<byte[]> sign(String source) { try { signature.update(source.getBytes(ISO_8859_1)); return Optional.of(signature.sign()); } catch (SignatureException e) { LOG.warn('SHA1WithRSA {} error: {}.', source, e); return Optional.empty(); } }}

單元測試,驗證簽名是否正確。先初始化Signature:

private Signature signature; @Before public void init() { try { byte[] key = Files.readAllBytes(Paths.get('/home/ls', 'ras_public_key.pem')); Security.addProvider(new BouncyCastleProvider()); final PemObject pemObject; try (PemReader pemReader = new PemReader(new InputStreamReader( new ByteArrayInputStream(key)))) { pemObject = pemReader.readPemObject(); } X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(pemObject.getContent()); KeyFactory factory = KeyFactory.getInstance('RSA'); PublicKey publicKey = factory.generatePublic(pubKeySpec); signature = Signature.getInstance('SHA1WithRSA'); signature.initVerify(publicKey); } catch (Exception e) { e.printStackTrace(); } }

驗證方法

private boolean verify(String source, String sign) { byte[] data = getDecoder().decode(sign); try { signature.update(source.getBytes()); return signature.verify(data); } catch (SignatureException e) { e.printStackTrace(); return false; } }

測試

String source = service.signature(request); String sign = signService.signAndEncode(source); System.out.println(sign); assertTrue(verify(source, sign));

證明,內(nèi)容沒有被篡改。

其中,ras_public_key.pem文件由openSSL生成。

ls@LS-8500:~$ openssl genrsa -out rsa_private_key.pem 1024Generating RSA private key, 1024 bit long modulus (2 primes)...+++++...............+++++e is 65537 (0x010001)ls@LS-8500:~$ openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt-----BEGIN PRIVATE KEY-----MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOk4nqif4LtwfePZIeGgUc5XYbWk8FpT6UEgO/43i0uprf2RXs3j9eDjOyRwkW2iMCF6S3bNxYuiyJv4eNc+8w87PJ9bOMRq9WH+ISWIfnPu2x6A1oNOeNkAL7v3ztmpcAn2bNMJ5VscSKp8S1U02LbHpOErPjvnEul9a/e8xb7TAgMBAAECgYEAvpMeyuoCKQiORo6aqhVoY7VxyY2jPhyNYUNm4qAeulBINgkBMDtUI1VrcaZun+jFbcXSPp19DFKTnSgYDsOItt04VLRSZm5yU1EfL21ZvbxIQjjSMv4BxndjdfdoGh5Gve0p1vqtnXtMivkNNI/HdCrxR2CpcGNo4Uqg+zgvwzECQQD1yULuH1sMTEGqLHZaBXVVt1ny+oF+3CnDz2ZdQTWjSLFfBSKplCL8TuEakauUiYf6BVtOjrpzKHRs7hDuZLW5AkEA8umwPbO09ijQdg5e/nkEnJnG5C4krXZuIcsYnf1wrBCLAoOImgDSvVzRrXHMGNvvP0D3gTIxwZSNPt571OFe6wJBAJmcOm9WO3IZKqTvetxSMv3qRJY+B7bAZH3TXleEDMDLCsenDv3K7n6f0cHoLsL7nXcd5+3V+CNGslTuCLjlSkkCQQCM1fqNu5xmwAElAW4IIkgPN4U+FJbFT43I4ATUzPU/fZPrEDHqACIvEhqrcfgATbuns9YMPPrmHmfKFJo9MbGjAkEAzmbWIsDQP4S8TJVd6PvyNZgNrTZvtlMT8/v4MytaEErrljhAR/YLKLcWFxLmQNAL9g4MSsHT8KunE5YrBmkXkg==-----END PRIVATE KEY-----ls@LS-8500:~$ openssl rsa -in rsa_private_key.pem -pubout -out ras_public_key.pemwriting RSA key

補充知識:Java導(dǎo)入OpenSSL生成的公私鑰文件

1. 生成2048-bit RSA私鑰

$ openssl genrsa -out private_key.pem 2048

2. 導(dǎo)出RSA公鑰

$ openssl rsa -in private_key.pem -pubout -out public_key.pem

3. 將公私鑰文件private_key.pem和public_key.pem的頭尾注釋去掉

即:

-----BEGIN PUBLIC KEY-----

-----END PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----

-----END RSA PRIVATE KEY-----

4. 讀取公私鑰文件內(nèi)容

// filePath即為private_key.pem和public_key.pempublic static String getKeyFromFile(String filePath) throws Exception { File file = new File(filePath); InputStream ins = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(ins)); String readLine = null; StringBuffer sb = new StringBuffer(); while ((readLine = br.readLine()) != null) { sb.append(readLine); } br.close(); ins.close(); return new String(sb);}

5. 讀取私鑰

public static PrivateKey getPrivateKey(String privateKey) throws Exception { // 解碼由base64編碼的私鑰 byte[] keyBytes = decryptBASE64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取得私鑰 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); return priKey;}

6. 讀取公鑰

public static PublicKey getPublicKey(String publicKeyStr) throws Exception { // 解碼由base64編碼的公鑰 byte[] keyBytes = decryptBASE64(publicKeyStr); // 取得公鑰 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); return publicKey;}

以上這篇Java讀取OpenSSL生成的PEM公鑰文件操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 美女视频网站永久免费观看软件 | 精品久久久久久中文字幕一区 | 欧美一区二区三区视频在线 | 久久久精品成人免费看 | 波野多结衣在线观看 | 日本精品中文字幕有码 | 日本 亚洲 欧美 | 日本妞xxxxxxxxx69| 美女被免费视频的网站 | 日韩成人在线播放 | 国产欧美一区二区三区在线看 | 一级啊片 | 欧美一区二区三区精品国产 | 手机国产日韩高清免费看片 | 男人天堂网在线 | 日韩视频免费一区二区三区 | 草草影院ccyy免费看片 | 日韩久草| 国产精品国产三级在线高清观看 | 99爱精品视频 | 久久久久久国产精品免费 | 精品在线播放 | 成人18免费网站在线观看 | 欧美另类videosbestsex久久 | 欧美黑人巨大最猛性xxxxx | 亚洲综合在线观看视频 | 欧美特级特黄a大片免费 | 国产成人精品久久一区二区小说 | 色综合在 | 九一精品国产 | 99爱视频 | 亚洲va久久久噜噜噜久久狠狠 | 亚洲视频免费在线观看 | 在线观看精品国内福利视频 | 亚洲 欧美 日韩 在线 中文字幕 | 毛片免费观看日本中文 | 高h原耽肉汁动漫视频 | 在线视频自拍 | 日本成a人片在线观看网址 日本成年人视频网站 | 白嫩美女直冒白浆 | 亚洲人在线播放 |