Kho khóa là một cơ sở lưu trữ để lưu trữ các khóa mật mã và chứng chỉ. Chúng thường được sử dụng trong giao tiếp SSL để chứng minh danh tính của máy chủ và máy khách. Một kho khóa có thể là một tệp hoặc một thiết bị phần cứng. Có ba loại mục có thể được lưu trữ trong một kho khóa tùy thuộc vào loại kho khóa.
Ba loại mục là:
PrivateKey : Đây là một loại khóa được sử dụng trong mật mã bất đối xứng. Nó thường được bảo vệ bằng mật khẩu vì tính nhạy cảm của nó. Nó cũng có thể được sử dụng để ký chữ ký số.
Certificate : Một chứng chỉ chứa một khóa công khai có thể xác định đối tượng được tuyên bố trong chứng chỉ. Nó thường được sử dụng để xác minh danh tính của máy chủ. Đôi khi nó cũng được sử dụng để xác định máy khách khi được yêu cầu.
SecretKey : Một mục khóa được sử dụng trong mật mã đối xứng.
Tùy thuộc vào các mục mà kho khóa có thể lưu trữ và cách kho khóa có thể lưu trữ các mục, có một vài loại kho khóa khác nhau trong Java: JKS, JCEKS, PKCS12, PKCS11 và DKS. Bạn có thể tìm thấy giới thiệu về các kho khóa này trên mô tả Kiến trúc Mật mã Java của Oracle.
Tiếp theo, chúng ta sẽ có cái nhìn tổng quan về các loại kho khóa này.
JKS, Kho khóa Java. Bạn có thể tìm thấy tệp này tại sun.security.provider.JavaKeyStore. Kho khóa này dành riêng cho Java, nó thường có phần mở rộng là jks. Loại kho khóa này có thể chứa các khóa riêng và chứng chỉ, nhưng nó không thể được sử dụng để lưu trữ các khóa bí mật. Vì nó là một kho khóa dành riêng cho Java, nên nó không thể được sử dụng trong các ngôn ngữ lập trình khác. Các khóa riêng được lưu trữ trong JKS không thể được trích xuất trong Java.
JCEKS, kho khóa JCE (Java Cryptography Extension KeyStore). Nó là một siêu tập của JKS với nhiều thuật toán được hỗ trợ hơn. Đây là một tiêu chuẩn nâng cao được thêm vào sau bởi Sun. Bạn có thể tìm thấy tệp này tại com.sun.crypto.provider.JceKeyStore. Kho khóa này có phần mở rộng là jceks. Các mục có thể được đặt trong kho khóa JCEKS là khóa riêng, khóa bí mật và chứng chỉ. Kho khóa này cung cấp khả năng bảo vệ mạnh mẽ hơn cho các khóa riêng được lưu trữ bằng cách sử dụng mã hóa Triple DES.
Nhà cung cấp của JCEKS là SunJCE, nó được giới thiệu trong Java 1.4. Do đó, trước Java 1.4, chỉ có thể sử dụng JKS.
PKCS12, đây là một loại kho khóa tiêu chuẩn có thể được sử dụng trong Java và các ngôn ngữ khác. Bạn có thể tìm thấy triển khai kho khóa này tại sun.security.pkcs12.PKCS12KeyStore. Nó thường có phần mở rộng là p12 hoặc pfx. Bạn có thể lưu trữ các khóa riêng, khóa bí mật và chứng chỉ trên loại này. Không giống như JKS, các khóa riêng trên kho khóa PKCS12 có thể được trích xuất trong Java. Loại này có thể di chuyển và có thể được vận hành với các thư viện khác được viết bằng các ngôn ngữ khác như C, C++ hoặc C#.
Hiện tại, loại kho khóa mặc định trong Java là JKS, tức là định dạng kho khóa sẽ là JKS nếu bạn không chỉ định -storetype khi tạo kho khóa bằng keytool. Tuy nhiên, loại kho khóa mặc định sẽ được thay đổi thành PKCS12 trong Java 9 vì khả năng tương thích nâng cao của nó so với JKS. Bạn có thể kiểm tra loại kho khóa mặc định tại tệp $JRE/lib/security/java.security:
PKCS11, đây là một loại kho khóa phần cứng. Nó cung cấp một giao diện cho thư viện Java để kết nối với các thiết bị kho khóa phần cứng như Luna của SafeNet, nCipher hoặc Thẻ thông minh. Bạn có thể tìm thấy triển khai này tại sun.security.pkcs11.P11KeyStore. Khi bạn tải kho khóa, bạn không cần tạo nhà cung cấp cụ thể với cấu hình cụ thể. Kho khóa này có thể lưu trữ các khóa riêng, khóa bí mật và chứng chỉ. Khi tải kho khóa, các mục sẽ được truy xuất từ kho khóa và sau đó được chuyển đổi thành các mục phần mềm.
DKS, Domain KeyStore là một kho khóa của kho khóa. Nó trừu tượng hóa một tập hợp các kho khóa được trình bày như một kho khóa logic duy nhất. Bản thân nó thực sự không phải là một kho khóa. Loại kho khóa mới này được giới thiệu trong Java 8. Có một lớp mới DomainLoadStoreParameter có liên quan chặt chẽ đến DKS.
Kho khóa này nằm tại sun.security.provider.DomainKeyStore.java.
Windows-MY, đây là một loại kho khóa trên Windows được quản lý bởi hệ điều hành Windows. Nó lưu trữ các khóa riêng và chứng chỉ của người dùng có thể được sử dụng để thực hiện các hoạt động mật mã như xác minh chữ ký, mã hóa dữ liệu, v.v. Vì nó là một loại kho khóa gốc, nên Java không có API chung để truy cập vào nó. Oracle cung cấp một API riêng để truy cập kho khóa Windows-MY - SunMSCAPI. Lớp nhà cung cấp cho API này là sun.security.mscapi.SunMSCAPI.
BKS, kho khóa BoucyCastle, là một định dạng kho khóa được cung cấp bởi nhà cung cấp thư viện mật mã Java của bên thứ ba phổ biến - BouncyCastle. Nó là một kho khóa tương tự như JKS do Oracle JDK cung cấp. Nhưng nó hỗ trợ lưu trữ khóa bí mật, khóa riêng và chứng chỉ. Nó thường được sử dụng trong phát triển ứng dụng di động.
Trong Java, có một vài lựa chọn về cách xử lý kho khóa. Viết mã Java rõ ràng là một lựa chọn. Ngoài ra, một công cụ đi kèm với JDK cũng có thể được sử dụng, đó là keytool.
keytool là một công cụ dòng lệnh. Nó có thể được sử dụng để tạo kho khóa, tạo khóa, nhập và xuất chứng chỉ, v.v. Để biết danh sách đầy đủ các lệnh mà keytool hỗ trợ, bạn có thể tham khảo hướng dẫn keytool của Oracle.
Nếu bạn đang sử dụng IBM JDK, có một công cụ khác có thể được sử dụng, đó là ikeyman. ikeyman là một công cụ GUI có thể cung cấp chế độ xem đơn giản về kho khóa. Các mục trong kho khóa. Khóa và chứng chỉ cũng có thể được tạo bằng ikeyman. Đây là một công cụ thường được sử dụng bởi các quản trị viên hệ thống.
Dưới đây là chi tiết của từng kho khóa được hỗ trợ trong Java.
- Các loại kho khóa khác nhau trong Java - JKS
- Các loại kho khóa khác nhau trong Java - JCEKS
- Các loại kho khóa khác nhau trong Java - PKCS12
- Các loại kho khóa khác nhau trong Java - PKCS11
- Các loại kho khóa khác nhau trong Java - DKS
- Các loại kho khóa khác nhau trong Java - Windows-MY
- Các loại kho khóa khác nhau trong Java - BKS