Sé que nunca debemos "rodar nuestro propio criptografía", pero quiero entender el funcionamiento interno. He escrito las siguientes dos funciones de cifrado / descifrado en 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
}
Supongo (lo que sé que no debería) que random_bytes
produce un conjunto de bytes aleatorios y criptográficos seguros, que de acuerdo con la documentación. También utilizo un Vector de inicialización ( iv
) que hace que el cifrado sea diferente cada vez que se proporciona la misma entrada.
¿Es este código fundamentalmente defectuoso desde el punto de vista de la seguridad de alguna manera? Y, suponiendo que no lo es entonces es hash-then-encrypt (o similar) el siguiente" subir de nivel "?