Încerc să criptez și să stochez șiruri de caractere în PHP, conform exemplului #1 de pe Documentația PHP openssl_encrypt.
<?php
//$key ar fi trebuit să fie generat anterior într-un mod sigur din punct de vedere criptografic, cum ar fi openssl_random_pseudo_bytes
$text clar = „mesajul de criptat”;
$cipher = "aes-128-gcm";
dacă (în_array($cifru, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cifru);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($text simplu, $cifrare, $cheie, $opțiuni=0, $iv, $tag);
//magazin $cifru, $iv și $etichetă pentru decriptare mai târziu
$original_plaintext = openssl_decrypt($text cifrat, $cifrare, $cheie, $opțiuni=0, $iv, $tag);
ecou $original_text simplu."\n";
}
?>
Dacă utilizatorul este responsabil pentru amintirea $key, este sigur să depozitați $iv alături de șirul criptat din baza de date?
Din această altă întrebare AES 256 CBC - Stocarea datelor locale, cum se salvează vectorul IV? iar altele pot vedea importanța unui unic $iv dar raspunsul mentioneaza:
Dacă utilizați AES-CBC, puteți stoca IV-ul așa cum doriți. Nu este important să păstrați secretul IV; trebuie doar să te asiguri că un adversar nu poate prezice IV-ul în avans.
Acest lucru se aplică și pentru GCM?
EDIT: Dacă nu mă înșel, această întrebare SO, Încercarea de decriptare cu aes-256-gcm cu php este raspunsul.(care este da, IV-ul și Tag-ul pot fi stocate alături de textul cifrat)