2016-04-22 11 views
6

Tôi muốn nhập vào khóa AndroidKeyStore. Vì vậy, tôi có thể tạo ra nó bằng openssl ở sau cáchCách nhập khóa riêng RSA, được tạo bởi openssl, vào AndroidKeyStore

openssl rsa -văn bản -in privateKey2048.pem

openssl pkcs8 -topk8 -inform PEM -in ./privateKey2048.pem -outform DER out private2048.der -nocrypt

sau đó tôi có thể chuyển đổi nó từ private2048.der sang định dạng hex, có thể được chuyển đổi trong ByteArray trong ứng dụng android. Nhưng nó không rõ ràng đối với tôi, Làm cách nào để nhập byteArray này vào AndroidKeyStore?

Vì vậy, nói chung, câu hỏi của tôi là cách nhập vào khóa KeyStore tồn tại dưới dạng Chuỗi hoặc byteArray?

ps: Tôi biết rằng có thể tạo keyPair bằng keyPairGenerator.generateKeyPair(), nhưng tôi muốn nhập khóa của mình, ví dụ được tạo bởi openssl và sau đó được mã hóa cứng trong ứng dụng.

+0

Bạn có thể tham khảo bài đăng này http://stackoverflow.com/questions/36688119/import-existing-private-key-into-bks-keystore –

Trả lời

4

Không nên viết mã khóa cá nhân vào ứng dụng của bạn. Phím này bị xâm phạm vì nội dung của APK của bạn không bí mật và do đó, khóa có thể được trích xuất từ ​​APK. Nếu bạn vẫn tin rằng bạn cần phải làm điều này bất chấp cảnh báo này, hãy đọc tiếp.

Để nhập khóa cá nhân vào Android Keystore, bạn cần thể hiện nó dưới dạng cá thể PrivateKey và sau đó bạn cũng cần chứng chỉ X.509 (khóa công khai tương ứng với khóa riêng) được biểu thị dưới dạng phiên bản X509Certificate. Điều này là do trừu tượng JCA KeyStore không hỗ trợ lưu trữ khóa cá nhân mà không có chứng chỉ.

Để chuyển đổi các PKCS # 8 DER mã hóa khóa bí mật vào một PrivateKey:

PrivateKey privateKey = 
    KeyFactory.getInstance("RSA").generatePrivate(
     new PKCS8EncodedKeySpec(privateKeyPkcs8)); 

Để chuyển đổi giấy chứng nhận PEM hoặc DER mã hóa thành một Giấy chứng nhận:

Certificate cert = 
    CertificateFactory.getInstance("X.509").generateCertificate(
     new ByteArrayInputStream(pemOrDerEncodedCert)); 

Cuối cùng, để nhập tin khóa và chứng chỉ vào mục nhập "myKeyAlias" của Android Keystore:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
ks.setKeyEntry("myKeyAlias", privateKey, null, new Certificate[] {cert}); 

Xem mo xem lại các ví dụ nâng cao tại https://developer.android.com/reference/android/security/keystore/KeyProtection.html.

+0

Cảm ơn bạn rất nhiều. ps:> "Không nên viết mã khóa riêng vào ứng dụng của bạn." Có, tôi biết, tôi cần nó cho mục đích giáo dục. – i716

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