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");