Java Cryptography - Lưu trữ khóa
Khóa và chứng chỉ được sử dụng / tạo được lưu trữ trong cơ sở dữ liệu được gọi là kho khóa. Theo mặc định, cơ sở dữ liệu này được lưu trữ trong một tệp có tên.keystore.
Bạn có thể truy cập nội dung của cơ sở dữ liệu này bằng cách sử dụng KeyStore lớp của java.securitygói hàng. Điều này quản lý ba mục nhập khác nhau là PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
Lưu trữ khóa trong kho khóa
Trong phần này, chúng ta sẽ học cách lưu trữ khóa trong kho khóa. Để lưu trữ khóa trong kho khóa, hãy làm theo các bước dưới đây.
Bước 1: Tạo một đối tượng KeyStore
Các getInstance() phương pháp của KeyStore lớp của java.security gói chấp nhận một giá trị chuỗi đại diện cho kiểu của kho khóa và trả về một đối tượng KeyStore.
Tạo một đối tượng của lớp KeyStore bằng cách sử dụng getInstance() như hình dưới đây.
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
Bước 2: Tải đối tượng KeyStore
Các load() phương thức của lớp KeyStore chấp nhận một đối tượng FileInputStream đại diện cho tệp kho khóa và một tham số Chuỗi chỉ định mật khẩu của KeyStore.
Nói chung, KeyStore được lưu trữ trong tệp có tên cacerts, ở vị trí C:/Program Files/Java/jre1.8.0_101/lib/security/ và mật khẩu mặc định của nó là changeit, tải nó bằng cách sử dụng load() như hình dưới đây.
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
Bước 3: Tạo đối tượng KeyStore.ProtectionParameter
Khởi tạo KeyStore.ProtectionParameter như hình dưới đây.
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
Bước 4: Tạo đối tượng SecretKey
Tạo SecretKey (interface) đối tượng bằng cách khởi tạo lớp con của nó SecretKeySpec. Trong khi khởi tạo, bạn cần chuyển mật khẩu và thuật toán dưới dạng tham số cho hàm tạo của nó như hình dưới đây.
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
Bước 5: Tạo một đối tượng SecretKeyEntry
Tạo một đối tượng của SecretKeyEntry lớp bằng cách vượt qua SecretKey đối tượng được tạo ở bước trên như hình dưới đây.
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
Bước 6: Đặt một mục nhập vào KeyStore
Các setEntry() phương pháp của KeyStore lớp chấp nhận một tham số Chuỗi đại diện cho bí danh mục nhập kho khóa, SecretKeyEntry đối tượng, một đối tượng ProtectionParameter và lưu trữ mục nhập dưới bí danh đã cho.
Đặt mục nhập vào kho khóa bằng cách sử dụng setEntry() như hình dưới đây.
//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
Example
Ví dụ sau đây lưu trữ các khóa vào kho khóa tồn tại trong tệp “cacerts” (hệ điều hành windows 10).
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class StoringIntoKeyStore{
public static void main(String args[]) throws Exception {
//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");
//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);
//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
//Storing the KeyStore object
java.io.FileOutputStream fos = null;
fos = new java.io.FileOutputStream("newKeyStoreName");
keyStore.store(fos, password);
System.out.println("data stored");
}
}
Output
Chương trình trên tạo ra kết quả sau:
System.out.println("data stored");