So che non dovremmo mai "lanciare la nostra crittografia", ma voglio capire il funzionamento interno. Ho scritto le seguenti due funzioni di crittografia / decrittografia in PHP:
function encrypt($message) {
$key = hash("sha256", base64_decode($secretpw64)); // get key from secret password
$iv = random_bytes(16); // create an iv
$output = openssl_encrypt($message, "AES-256-CBC", $key, 0, $iv); // encrypt using openssl
return implode(".", array(base64_encode($iv), $output)); // join iv.output
}
function decrypt($message) {
$key = hash("sha256", base64_decode($secretpw64)); // get key from secret password
$segs = explode(".", $message); // separate the message
$iv = base64_decode($segs[0]); // get the iv
$emsg = $segs[1]; // get the encrypted message
return openssl_decrypt($emsg, "AES-256-CBC", $key, 0, $iv); // decrypt and return
}
Suppongo (che so che non dovrei) che random_bytes
produce un insieme casuale di byte casuali e sicuri, che secondo i documenti lo fa. Io uso anche un vettore di inizializzazione ( iv
) che fa sì che la crittografia sia diversa ogni volta in base allo stesso input.
Questo codice è fondamentalmente difettoso dal punto di vista della sicurezza in alcun modo? E, supponendo che non lo sia, è hash-then-encrypt (o simile) il prossimo" level up "?