一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java讀取OpenSSL生成的PEM公鑰文件操作

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

2020-10-07 22:35此心光明-超然 Java教程

這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

項目需求,使用SHA1WithRSA算法,對接口數據做簽名。

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Service
class 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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();
 }
}

驗證方法

?
1
2
3
4
5
6
7
8
9
10
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;
 }
}

測試

?
1
2
3
4
String source = service.signature(request);
String sign = signService.signAndEncode(source);
System.out.println(sign);
assertTrue(verify(source, sign));

證明,內容沒有被篡改。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ls@LS-8500:~$ openssl genrsa -out rsa_private_key.pem 1024
Generating 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-----
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOk4nqif4LtwfePZ
IeGgUc5XYbWk8FpT6UEgO/43i0uprf2RXs3j9eDjOyRwkW2iMCF6S3bNxYuiyJv4
eNc+8w87PJ9bOMRq9WH+ISWIfnPu2x6A1oNOeNkAL7v3ztmpcAn2bNMJ5VscSKp8
S1U02LbHpOErPjvnEul9a/e8xb7TAgMBAAECgYEAvpMeyuoCKQiORo6aqhVoY7Vx
yY2jPhyNYUNm4qAeulBINgkBMDtUI1VrcaZun+jFbcXSPp19DFKTnSgYDsOItt04
VLRSZm5yU1EfL21ZvbxIQjjSMv4BxndjdfdoGh5Gve0p1vqtnXtMivkNNI/HdCrx
R2CpcGNo4Uqg+zgvwzECQQD1yULuH1sMTEGqLHZaBXVVt1ny+oF+3CnDz2ZdQTWj
SLFfBSKplCL8TuEakauUiYf6BVtOjrpzKHRs7hDuZLW5AkEA8umwPbO09ijQdg5e
/nkEnJnG5C4krXZuIcsYnf1wrBCLAoOImgDSvVzRrXHMGNvvP0D3gTIxwZSNPt57
1OFe6wJBAJmcOm9WO3IZKqTvetxSMv3qRJY+B7bAZH3TXleEDMDLCsenDv3K7n6f
0cHoLsL7nXcd5+3V+CNGslTuCLjlSkkCQQCM1fqNu5xmwAElAW4IIkgPN4U+FJbF
T43I4ATUzPU/fZPrEDHqACIvEhqrcfgATbuns9YMPPrmHmfKFJo9MbGjAkEAzmbW
IsDQP4S8TJVd6PvyNZgNrTZvtlMT8/v4MytaEErrljhAR/YLKLcWFxLmQNAL9g4M
SsHT8KunE5YrBmkXkg==
-----END PRIVATE KEY-----
ls@LS-8500:~$ openssl rsa -in rsa_private_key.pem -pubout -out ras_public_key.pem
writing RSA key

補充知識:Java導入OpenSSL生成的公私鑰文件

1. 生成2048-bit RSA私鑰

$ openssl genrsa -out private_key.pem 2048

2. 導出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. 讀取公私鑰文件內容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// filePath即為private_key.pem和public_key.pem
public 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. 讀取私鑰

?
1
2
3
4
5
6
7
8
9
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. 讀取公鑰

?
1
2
3
4
5
6
7
8
9
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公鑰文件操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/weixin_43364172/article/details/90401648

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品国产视频澳门 | 亚洲国产欧美久久香综合 | 石原莉奈被店长侵犯免费 | 国语自产拍在线观看7m | 岛国a香蕉片不卡在线观看 荡女淫春2古装 | 咪咪爱991 | 给我视频免费看 | 欧美视频在线播放观看免费福利资源 | 999精品视频这里只有精品 | www视频免费 | 青春草在线观看精品免费视频 | 希望影院高清免费观看视频 | 福利视频一区二区三区 | 天天爱天天插 | 狠狠撸在线影院 | futa巨大好爽好长 | wankz视频 | 久久亚洲精品中文字幕60分钟 | 成 人 免费 小说在线观看 | 国产va免费精品高清在线 | 日本高清免费中文字幕不卡 | 精品国产乱码久久久久久免费流畅 | 成年人在线播放视频 | 精品视频日本 | 国模娜娜一区二区三区 | xxx久久| 欧美xxoo黑人又粗暴 | 99久久精品免费观看区一 | 午夜欧美精品久久久久久久 | 91精品手机国产露脸 | 午夜在线观看视频 | 日韩大片在线 | 五月婷婷丁香在线视频 | 天天狠天天透天干天天怕处 | 免费一级毛片完整版在线看 | 欧美a欧美1级 | 五月天婷婷精品免费视频 | 韩日视频在线观看 | 久久99国产精品二区不卡 | 国产欧美va欧美va香蕉在线观 | 77成人影视|