PHP ile Verileri Şifrelemek
Bazen bazı durumlarda herkese açık olan bir bilgiyi gizlemek isteyebilirsiniz. En azından şifreli olarak görünmesini ve sizden başkasının buna sahip olmamasını istersiniz.
Bunu php'de openssl fonksiyonları ile yapmak mümkün. Belli bir şifreleme algoritmasına göre, sizin belirlediğiniz bir anahtar değer ile verinizi encode edebilir ve istediğiniz zaman aynı anahtar değeri kullanarak decode edip bilgiye tekrar ulaşabilirsiniz.
Bunu genelde form'da gönderdiğiniz id değerini gizlemek için kullanabilirsiniz, ya da örneğin bir video token değeriniz vardır, bu token nihayetinde belli bir süre geçerli bir linke gitmek için kullanılıyordur. Token'ı bilen herkes bu bağlantıyı oluşturabilir, ancak token'ı şifrelerseniz neticede sadece sizin geçici süreliğine oluşturduğunuz bağlantıyı kullanmak zorunda kalacaklardır.
Bir başka örnekte prototürk üzerinden vereyim. Örneğin kullanıcıların birbirlerini takip etme özellikleri var, bunu kısaca follow()
fonksiyonuna kullanıcı id'sini göndererek arkaplanda kontrol işlemlerini yapıyorum, ancak burada göstereceğim yöntem ile id'yi şifrelediğim için birinin console'u açıp for
döngüsü ile 1'den 1000'e kadar sayı üreterek bu takip işlemini otomatize etmesini engellemiş oldum, çünkü id'ler benim belirlediğim anahtar değer ile şifrelendiği için isteselerde böyle bir şey mümkün değil. İsteyen tek tek takip etmekte özgür :D
Geçerli Şifreleme Algoritmaları
Mevcut şifreleme algoritmalarını öğrenmek için şu fonksiyonu print_r()
ile bastırıp bakabilirsiniz.
print_r(openssl_get_cipher_methods());
Buradaki herhangi bir şifreleme algoritmasını kullanabilirsiniz. Elbette bu algoritmalarında kendilerine göre farklılıkları olabilir ancak bu beni biraz aşan bir konu, çok merak eden AES ve benzeri sistemleri inceleyerek anlamaya çalışabilir. Biz konunun özüne odaklanalım :)
openssl_encrypt()
ile Şifrelemek
Fonksiyon temelde üç değer alıyor. İlk olarak şifrelemek istediğiniz data, ikinci olarak şifreleme algoritmanız, üçüncü olarak şifreleme için kullanacağınız anahtar değer.
Örneğin prototurk.2021.xx1
anahtar değeri ile AES-128-ECB
algoritmasını kullanarak prototurk.com
değerini şifreleyelim.
$data = 'prototurk.com';
$cipher = 'AES-128-ECB';
$key = 'prototurk.2021.xx1';
$encoded = openssl_encrypt($data, $cipher, $key); // çıktı: IJ+QoM3fGYV9u6RByX1MQQ==
Evet artık elimizde prototurk.com
yerine herkese açık bir değer olan IJ+QoM3fGYV9u6RByX1MQQ==
var. Ancak bu değer, belirlenen anahtar değer olmadan hiçbir anlam ifade etmiyor.
openssl_decrypt()
ile Şifreyi Çözmek
Elimizde şifrelenmiş bir veri var, anahtar değeri biliyoruz, artık onu çözme vakti. Bu genelde veriyi gönderdiğiniz yerde şifreyi çözerek değeri kontrol etme işlemidir.
Yine şifreleme işlemi gibi, şifre çözmek içinde şifreli veri, şifreleme algoritması ve anahtar değere ihtiyacımız var.
$data = 'IJ+QoM3fGYV9u6RByX1MQQ==';
$cipher = 'AES-128-ECB';
$key = 'prototurk.2021.xx1';
$decoded = openssl_decrypt($data, $cipher, $key); // çıktı: prototurk.com
Şimdi olası bir senaryo düşünelim, diyelim ki birisi veriyi doğrudan normal bir değer olarak gönderdi. Bu decode işleminden geçtiğinde nasıl bir sonuç bekleriz? Gelin deneyelim.
$data = 'prototurk.com'; // verinin şifrelenmemiş birebir aynı halini gönderdik
$cipher = 'AES-128-ECB';
$key = 'prototurk.2021.xx1';
$decoded = openssl_decrypt($data, $cipher, $key);
var_dump($decoded);
verinin şifrelenmemiş birebir orjinal halini göndermemize rağmen, bizim belirlediğimiz şifreleme algoritması ve anahtar değer ile şifreyi çözemediğimiz için false
değeri dönüyor. Bu da kontrol için false olup olmadığına bakmak yeterli demektir. Yani;
$data = 'IJ+QoM3fGYV9u6RByX1MQQ==';
$cipher = 'AES-128-ECB';
$key = 'prototurk.2021.xx1';
$decoded = openssl_decrypt($data, $cipher, $key);
if (!$decoded){
echo "Hatalı bir değer gönderdiniz";
exit;
}
// sorun yoksa işlem buradan devam eder
// .....