Hashing vs Encryption vs Encoding vs Obfuscation

Bu yazımda birbirine oldukça karıştırılan hashing, encryption, encoding ve obfuscation kavramlarının farklarını anlatacağım. Sık sık birbirlerinin yerine kullanılan bu kelimeler birbirlerinden oldukça farklı olup, zaman zaman anlam karmaşaları yaşanmaktadır.

Encoding (Kodlama):

Buradaki amaç bilgiyi gizli tutmak değil, daha ziyade verilerin doğru bir biçimde tüketilmesini sağlamaktır. Kodlama, verileri halka açık bir şema kullanarak başka bir formata dönüştürür, böylece kolayca tersine çevrilebilir. Kodlama işlemindeki verilerin geriye döndürülmesi için herhangi bir anahtar gerekmez. Sadece şifreleme için kullanılan algoritma ve ya veri tablosunun bilinmesi yeterlidir.

Kodlamaya örnek olarak, ASCİİ, Unicode, URL Kodlama, Base64 verilebilir.

Encryption (Şifreleme):

Şifrelemenin esas amacı, verilerin bir başka kullanıcıya gönderimi sırasında gizli tutulmasıdır. Örneğin sadece bir kişinin okuyup anlayabileceği bir mektup gönderimi veya internet üzerinden şifre, kimlik numarası, kredi kartı numarası gibi hassas verilerin gönderimi sırasında duruma bağlı olarak istemci-sunucu veya istemci-istemci arasında bir şifreleme kurulması gerekmektedir. Özetle amaç kullanılabilirlik den ziyade gizliliktir.

Şifrelemede veriler yalnızca belirli  kullanıcıların şifreyi çözebileceği bir formata dönüştürülür. Şifreleme işleminin gerçekleştirilebilmesi için şifreli metin ile birlikte gizli tutulan bir anahtar kullanılır. Şifreyi çözmesi gereken kişi ise elindeki anahtarı kullanarak şifreyi düz metne çevirir.

Şifrelemeye örnek olarak AES, Blowfish, RSA verilebilir.

Hashing:

Hashing, veri bütünlüğünü sağlamak amacıyla kullanılmaktadır. Yani hashing deki asıl amaç bir şey değiştiğinde o şeyin değiştiğini anlayabilmemiz… Teknik olarak bir takım girdi alır ve sürekli aynı uzunlukta olacak çıktılar üretir. Bu çıktılar üretilirken dikkat edilmesi gereken özellikler şunlardır:

  1. Aynı girdi her zaman için aynı çıktıyı üretmelidir.
  2. Birden fazla girdi, asla aynı çıktıyı üretilmemelidir.
  3. Hash’ten ana veriye dönüş mümkün olmamalıdır.
  4. Verilen girdide yapılacak bir değişiklik, hashte büyük bir değişikliğe yol açmalıdır.

Hashing, belirli bir verinin değişmediğine dair güçlü kanıtlar üretmek için kullanılır. Alıcı gönderilen mesajı açtığında, gönderilen anahtar ile verinin değişmediğini teyit edebilir.

Hashing işlemine örnek olarak: SHA-5, MD5 verilebilir.

Obfuscation (Gizleme):

Gizlemenin amacı kaynak kodda zafiyet bulmayı veya veriyi kopyalamayı zoraştırmak amacıyla her hangi bir verinin anlaşılmasını zorlaştırmaktır. Böylece tersine mühendislik uygulandığında ürünü kopyalamak daha zor olmaktadır.

Gizlemenin güçlü bir şifreleme yöntemi olmadığı unutulmamalıdır. Kodlamada olduğu gibi verinin ilk baştaki haline ulaşım olasıdır. Ancak bu işlem manuel olduğundan oldukça zaman alacaktır.

Gizleme hakkındaki bir diğer önemli detay ise gizlenecek şeyin ne kadar belirsiz hale getirileceği ile ilgilidir. Örneğin bir bilgisayar kodunun anlaşılmasını zorlaştırmak istiyorsanız, Obfuscation işleminin ardından bilgisayarın bunu kolayca çözdüğünden emin olmalısınız. Aksi takdirde uygulama çeşitli hatalar ile karşılaşacaktır.

Obfuscation işlemine örnek olarak javascript obfuscator, proguard verilebilir.

Özet olarak;

Encoding, veri kullanılabilirliğini korumak içindir. İçeriği herkes tersine çevrilebilir. Bu içeriği ham haline dönüştürme işleminde herhangi bir anahtar gerekmez.

Encryption, verinin gizliliğini korumak içindir. İçeriğin ham haline dönüştürülebilmesi için anahtarın bilinmesi gerekmektedir.

Hashing, hash çıktısındaki değişikliklere bakarak içeriğin değişip değişmediğinin kontrolünü yapmak; veri bütünlüğünü sağlamak içindir.

Obfuscation, insanların bir veriyi anlamasını güçleştirmek için kullanılır. Genellikle tersine mühendislik işlemlerini zorlaştırmak amacıyla bilgisayar kodlarının karmaşıklaştırılmasında kullanılır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir