ฉันกำลังพยายามเข้ารหัสและจัดเก็บสตริงใน PHP ตามตัวอย่าง #1 บน เอกสาร PHP opensl_encrypt.
<?php
//ก่อนหน้านี้ $key ควรถูกสร้างขึ้นด้วยวิธีที่ปลอดภัยในการเข้ารหัส เช่น opensl_random_pseudo_bytes
$plaintext = "ข้อความที่จะเข้ารหัส";
$cipher = "aes-128-gcm";
ถ้า (in_array($การเข้ารหัส, opensl_get_cipher_methods()))
{
$ivlen = opensl_cipher_iv_length($ตัวเลข);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($ข้อความธรรมดา, $รหัส, $กุญแจ, $ตัวเลือก=0, $iv, $แท็ก);
// เก็บ $รหัส, $iv และ $แท็กสำหรับการถอดรหัสในภายหลัง
$original_plaintext = openssl_decrypt($ไซเฟอร์เท็กซ์ $รหัส, $กุญแจ, $ตัวเลือก=0, $iv, $แท็ก);
เสียงสะท้อน $original_plaintext"\n";
}
?>
หากผู้ใช้มีหน้าที่จดจำการ $key, มันปลอดภัยไหมที่จะเก็บ $iv ข้างสตริงที่เข้ารหัสในฐานข้อมูล?
จากคำถามอื่นนี้ AES 256 CBC - การจัดเก็บข้อมูลในเครื่อง วิธีบันทึกเวกเตอร์ IV และอื่น ๆ ฉันสามารถเห็นความสำคัญของการไม่ซ้ำกัน $iv แต่คำตอบระบุว่า:
หากคุณใช้ AES-CBC คุณสามารถจัดเก็บ IV ได้ตามต้องการ การเก็บ IV ไว้เป็นความลับนั้นไม่สำคัญ คุณเพียงแค่ต้องแน่ใจว่าฝ่ายตรงข้ามไม่สามารถคาดเดา IV ล่วงหน้าได้
สิ่งนี้ใช้กับ GCM ด้วยหรือไม่
แก้ไข: ถ้าฉันจำไม่ผิด คำถามนี้ พยายามถอดรหัสด้วย aes-256-gcm ด้วย php คือคำตอบ(ซึ่งใช่ สามารถเก็บ IV และ Tag ข้างข้อความเข้ารหัสได้)