คุณสามารถแปลงSecretKey
เป็นอาร์เรย์ไบต์ ( byte[]
) จากนั้น Base64 เข้ารหัสเป็นString
ไฟล์. ในการแปลงกลับเป็น a SecretKey
ให้ Base64 ถอดรหัส String และใช้ในการSecretKeySpec
สร้างต้นฉบับของคุณSecretKey
ใหม่
สำหรับ Java 8
SecretKey เป็น String:
// create new key
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
// get base64 encoded version of the key
String encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
สตริงเป็น SecretKey:
// decode the base64 encoded string
byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
// rebuild key using SecretKeySpec
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
สำหรับ Java 7 และก่อนหน้า (รวมถึง Android):
หมายเหตุฉัน:คุณสามารถข้ามส่วนการเข้ารหัส / ถอดรหัส Base64 และเก็บไว้byte[]
ใน SQLite ที่กล่าวว่าการเข้ารหัส / ถอดรหัส Base64 ไม่ใช่การดำเนินการที่มีราคาแพงและคุณสามารถจัดเก็บสตริงในเกือบทุกฐานข้อมูลได้โดยไม่มีปัญหา
หมายเหตุ II: Java เวอร์ชันก่อนหน้านี้ไม่มี Base64 ในหนึ่งในjava.lang
หรือjava.util
แพ็คเกจ มันเป็นไปได้อย่างไรที่จะใช้ตัวแปลงสัญญาณจากApache Commons Codec , ปราสาท Bouncyหรือฝรั่ง
SecretKey เป็น String:
// CREATE NEW KEY
// GET ENCODED VERSION OF KEY (THIS CAN BE STORED IN A DB)
SecretKey secretKey;
String stringKey;
try {secretKey = KeyGenerator.getInstance("AES").generateKey();}
catch (NoSuchAlgorithmException e) {/* LOG YOUR EXCEPTION */}
if (secretKey != null) {stringKey = Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT)}
สตริงเป็น SecretKey:
// DECODE YOUR BASE64 STRING
// REBUILD KEY USING SecretKeySpec
byte[] encodedKey = Base64.decode(stringKey, Base64.DEFAULT);
SecretKey originalKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
String
อินสแตนซ์ใน Java ในขณะที่อ็อบเจ็กต์หลักและไบต์อาเรย์อาจถูกล้าง ซึ่งหมายความว่าคีย์สามารถใช้งานได้ภายในหน่วยความจำเป็นระยะเวลานานขึ้น ควรใช้ (ป้องกันด้วยรหัสผ่าน)KeyStore
โดยควรใช้ระบบรันไทม์ / OS หรือแม้แต่ฮาร์ดแวร์