2014-07-01 21 views
5

Tôi đang cố gắng lưu khóa cá nhân trong tệp pem, được bảo vệ bằng mật khẩu. Vấn đề là, tệp pem được tạo và i thậm chí có thể mở nó bằng openssl nhưng không yêu cầu mật khẩu!JAVA: Cách lưu khóa cá nhân trong tệp pem bằng mật khẩu bảo vệ

Đây là mã:

 KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); 
     keygen.initialize(2048); 
     KeyPair keypair = keygen.generateKeyPair(); 

     PrivateKey privKey = keypair.getPrivate(); 

     PKCS8Generator encryptorBuilder = new PKCS8Generator(privKey); 
     encryptorBuilder.setPassword("testing".toCharArray()); 
     PEMWriter writer = new PEMWriter(new FileWriter(new File("pk.pem"))); 
     PemObject obj = encryptorBuilder.generate(); 

     writer.writeObject(obj); 
     writer.flush(); 
     writer.close(); 

Sau khi nó thực thi, tôi cố gắng để mở file pk.pem

openssl rsa -in pk.pem -check 

và nó mang lại:

RSA key ok 
writing RSA key 
-----BEGIN RSA PRIVATE KEY----- 
(... some key appears here ...) 
-----END RSA PRIVATE KEY----- 

Nó được giả để yêu cầu mật khẩu trước khi cấp quyền truy cập vào khóa riêng! Một số người có thể giúp tôi không?

Trả lời

6

Bạn nên đọc kỹ tài liệu BouncyCastle. Nó cho biết hàm tạo bạn sử dụng:

// Constructor for an unencrypted private key PEM object. 
PKCS8Generator(java.security.PrivateKey key) 

// Constructor for an encrypted private key PEM object. 
PKCS8Generator(java.security.PrivateKey key, java.lang.String algorithm, java.lang.String provider) 

Do đó bạn đang sử dụng hàm tạo để tạo một cá thể PKCS8Generator không được mã hóa. Mật khẩu bạn đặt là không có hiệu lực.

Sử dụng một trong các hàm tạo khác thay vì tạo một cá thể mã hóa theo tài liệu. Lưu ý: Mã trong câu hỏi yêu cầu một phiên bản lỗi thời của BouncyCastle (1.4x?), Bởi vì phiên bản hiện tại (1.5x) có các hàm tạo khác nhau, không tương thích với các hàm được trình bày trong câu trả lời này.


Đối với các phiên bản mới hơn sử dụng:

import org.bouncycastle.openssl.jcajce.JcaPEMWriter; 

JcaPEMWriter writer = new JcaPEMWriter(new PrintWriter(System.out)); 
writer.writeObject(sk); 
writer.close(); 

có thể thay thế PrintWriter với bất kỳ Writer khác của khóa học.

+0

Cảm ơn bạn rất nhiều! Tôi không biết điều đó ... và tôi cũng không biết tôi đang sử dụng phiên bản BC lỗi thời. Một lần nữa cảm ơn bạn. – Snox

+0

Cập nhật câu trả lời, tôi đã có đủ đại diện anyway :) –

Các vấn đề liên quan