Java Cryptography - การจัดเก็บคีย์

คีย์และใบรับรองที่ใช้ / สร้างขึ้นจะถูกเก็บไว้ในฐานข้อมูลที่เรียกว่าเป็นที่เก็บคีย์ โดยค่าเริ่มต้นฐานข้อมูลนี้จะถูกเก็บไว้ในไฟล์ชื่อ.keystore.

คุณสามารถเข้าถึงเนื้อหาของฐานข้อมูลนี้โดยใช้ไฟล์ KeyStore คลาสของ java.securityแพ็คเกจ สิ่งนี้จัดการสามรายการที่แตกต่างกัน ได้แก่ PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

การจัดเก็บคีย์ในที่เก็บคีย์

ในส่วนนี้เราจะเรียนรู้วิธีการจัดเก็บคีย์ในที่เก็บคีย์ ในการจัดเก็บคีย์ในที่เก็บคีย์ให้ทำตามขั้นตอนด้านล่าง

ขั้นตอนที่ 1: สร้างวัตถุ KeyStore

getInstance() วิธีการของ KeyStore คลาสของ java.security แพ็กเกจยอมรับค่าสตริงที่แสดงถึงชนิดของที่เก็บคีย์และส่งคืนอ็อบเจ็กต์ KeyStore

สร้างออบเจ็กต์ของคลาส KeyStore โดยใช้ไฟล์ getInstance() วิธีการดังแสดงด้านล่าง

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

ขั้นตอนที่ 2: โหลดวัตถุ KeyStore

load() เมธอดของคลาส KeyStore ยอมรับอ็อบเจ็กต์ FileInputStream ที่เป็นตัวแทนของไฟล์ที่เก็บคีย์และพารามิเตอร์ String ที่ระบุรหัสผ่านของ KeyStore

โดยทั่วไป KeyStore จะถูกเก็บไว้ในไฟล์ชื่อ cacertsในสถานที่ C:/Program Files/Java/jre1.8.0_101/lib/security/ และรหัสผ่านเริ่มต้นคือ changeitโหลดโดยใช้ไฟล์ load() วิธีการดังแสดงด้านล่าง

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

ขั้นตอนที่ 3: สร้างวัตถุ KeyStore.ProtectionParameter

เริ่มต้น KeyStore.ProtectionParameter ดังที่แสดงด้านล่าง

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

ขั้นตอนที่ 4: สร้างวัตถุ SecretKey

สร้างไฟล์ SecretKey (อินเทอร์เฟซ) อ็อบเจ็กต์โดยสร้างอินสแตนซ์คลาสย่อย SecretKeySpec. ในขณะที่สร้างอินสแตนซ์คุณต้องส่งรหัสผ่านและอัลกอริทึมเป็นพารามิเตอร์ไปยังตัวสร้างดังที่แสดงด้านล่าง

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

ขั้นตอนที่ 5: สร้างวัตถุ SecretKeyEntry

สร้างวัตถุของไฟล์ SecretKeyEntry คลาสโดยผ่านไฟล์ SecretKey วัตถุที่สร้างในขั้นตอนข้างต้นดังที่แสดงด้านล่าง

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

ขั้นตอนที่ 6: ตั้งค่ารายการไปที่ KeyStore

setEntry() วิธีการของ KeyStore คลาสยอมรับพารามิเตอร์ String ที่แสดงนามแฝงรายการที่เก็บคีย์ a SecretKeyEntry วัตถุวัตถุ ProtectionParameter และเก็บรายการภายใต้นามแฝงที่กำหนด

ตั้งค่ารายการไปยังที่เก็บคีย์โดยใช้ setEntry() วิธีการดังแสดงด้านล่าง

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Example

ตัวอย่างต่อไปนี้เก็บคีย์ไว้ในที่เก็บคีย์ที่มีอยู่ในไฟล์ "cacerts" (ระบบปฏิบัติการ 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

โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -

System.out.println("data stored");