Aşağıda, openssl tabanlı metin şifreleme ve şifre çözme işlemi için PHP 8.1 üzerinde test edilmiş bir örnek betik bulunmaktadır.
nano encrypt-decrypt.php
<?php
define('ENCRYPTION_KEY', '<mark>benim-gizli-anahtarim-2121</mark>');
// Şifreleme
$plaintext = "<output>PHP 8.1'de şifreleme için test metni</output>";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, ENCRYPTION_KEY, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, ENCRYPTION_KEY, $as_binary=true);
$ciphertext = base64_encode($iv.$hmac.$ciphertext_raw);
<output>echo $ciphertext.'<br>';</output>
// Şifre Çözme
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$plaintext = openssl_decrypt($ciphertext_raw, $cipher, ENCRYPTION_KEY, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, ENCRYPTION_KEY, $as_binary=true);
if (hash_equals($hmac, $calcmac))
{
<output>echo $plaintext;</output>
}
?>
İlk satırda şifrelenmiş metin, ikinci satırda ise çözülmüş metin görünür. Sayfayı aynı metinle yeniden yüklediğimizde, şifreleme sonucu her seferinde farklı olacak, ancak şifre çözme sonucunda orijinal metin aynı şekilde elde edilecektir.
Fonksiyonları farklı dosyalarda kullanmak istiyorsanız, ENCRYPTION_KEY parametresini ayrı bir dosyada tanımlamanız gerekecektir.
No Comments Yet