Kart Okuyucudan Okunmuş Verilerin Cihazda Şifrelenmesi
Kart Okuyucudan Okunmuş Verilerin Cihazda Şifrelenmesi
Geçiş kontrol sistemini kendi ellerinizle kurarken, belki de en önemli detaylardan biri okuyucunun içinde sakladığı verinin güvenliğidir. Kart okuyucu, karttan okuduğu bilgileri cihaz belleğinde tutar. İşte tam burada, yetkisiz birinin bu verilere erişmesini önlemek için şifreleme devreye giriyor. Ben bu yazıda, kart verisi şifrelemeyi ve özellikle AES şifrelemasini nasıl uyguladığımı sizinle paylaşacağım.
Başlangıçta, kart verisinin neden şifrelenmesi gerektiğini anlamak önemli. Okuyucu bellekte depolanan kartın benzersiz numarası, dönem bilgisi ve diğer hassas bilgiler, sistem yönetiminin merkezî sunucusuna gelmeden önce bir ara aşamada kalıyor. Eğer birisi okuyucuyu fiziksel olarak ele geçirirse veya haberleşmeyi engellerse, bu veriler açık metin halinde ortaya çıkabilir. Bunun sonucu ise kart klonlaması veya başka sahtekârlık türleridir.
Adım 1: AES Şifreleme Algoritmasını Seçme
İlk olarak hangi şifreleme algoritmasını kullanacağımıza karar verdim. AES (Advanced Encryption Standard), endüstriyel uygulamalarda en yaygın kullanılan ve güvenilir seçeneğidir. 128, 192 veya 256 bit anahtar uzunluklarını destekler. Başlangıçta 128 bit yeterli gelse de, kritik uygulamalarda 256 bit tercih ediyorum.
AES'in en büyük avantajı, hem hız hem de güvenlik arasında mükemmel dengedir. Okuyucu cihazı genellikle sınırlı işlemci gücüne sahip olduğundan, AES gibi hafif ama güçlü bir yöntem tercih etmek gerekir.
Adım 2: Şifreleme Anahtarının Oluşturulması ve Yönetimi
Şifrelemenin en kritik noktası anahtar yönetimidir. Anahtarı nereden alacaksınız? İlk başlarda hata yaptığım yer burasıydı: anahtarı cihazın yazılımında sabit olarak bırakmak. Bu, bulunması çok kolay bir zayıflık yaratır.
Doğru yaklaşım şöyledir: Okuyucuya fiziksel olarak erişimi olan biri bile anahtarı bulamamalı. Bunu sağlamak için:
- Ana anahtarı (Master Key) sisteminizin sunucusunda güvenli bir şekilde saklayın.
- Her okuyucu için farklı bir alt anahtar (Device Key) oluşturun ve yalnızca o okuyucuya yükleyin.
- Anahtarlar cihazın salt okunur belleğinde (ROM) şifrelenmiş olarak depolanmalıdır.
- Periyodik olarak anahtarları döndürün (rotation), eski anahtarları kullanmayın.
Yazılım güncellemeleri sırasında anahtarları değiştirmek de iyi bir uygulamadır. Eski anahtarla şifrelenmiş veriler çözülemez hale gelirse, o cihazdan veri çıkarmak neredeyse imkânsız olur.
Adım 3: Verilerin Okuyucuda Şifrelenmesi
Kart okunduğu anda, okuyucu yazılımı hemen şu işlemi yapmalı:
- Karttan okuyucu (UID, tanım numarası vb.) çıkar.
- Bu veriyi AES algoritması ile, depolanan anahtar kullanarak şifrele.
- Şifrelenmiş veriyi bellekte sakla.
- Sunucuya göndermeden önce, iletişim kanalı üzerinde yeniden şifrele (opsiyonel ama önerilen).
Okuyucunun işlemci kapasitesi sınırlı ise, şifreleme işlemi yavaş olabilir. Ama bunu tolere etmeye değer, çünkü güvenlik daha önemlidir. Tipik bir kart okuma işlemi birkaç milisaniye sürüyor; şifreleme ekstra 10-50 milisaniye ekleyebilir. Bu fark kullanıcıya hiç hissettirmez.
Adım 4: Anahtar Dosya Biçimi
Anahtarları okuyucuya yüklemek için belli bir biçim seçin. Genellikle ikili (binary) dosya format kullanıyorum, çünkü bu şekilde anahtarı metin editörüyle açıp görmek imkânsız hale gelir. Dosya şu bilgileri içermeli:
| Alan | Boyut | Açıklama |
|---|---|---|
| Başlık | 4 byte | Dosya türünü tanımlayan imza |
| Versiyon | 2 byte | Anahtar yönetim versiyonu |
| Cihaz ID | 4 byte | Hangi okuyucu için olduğu |
| Anahtar | 32 byte (256 bit) | Gerçek şifreleme anahtarı |
| Kontrol Toplamı | 4 byte | Dosya bütünlüğü doğrulaması |
Adım 5: Bellek Yönetimi
Şifrelenmiş veri bellekte kalırken, asla orijinal (şifresiz) verileri bellekte tutmayın. Kart okuması tamamlandıktan sonra, geçici bellekleri sıfırla. Biraz paranoid gibi gelirse de, bir saldırgan bellek dökümü (memory dump) çekip tüm saklanan verileri bulabilir.
Bellek temizliği için dil kütüphanelerini değil, sistem çağrılarını kullanın. Derleyici optimizasyonları "şifreli verileri saklayan değişkenleri da kopyalamaktan kaçınarak" bellekleri sıfırlamayı atlatabilir. Bunu önlemek için `memset` veya benzeri fonksiyonlar kullanın.
Sık Yapılan Hatalar
Hata 1: Anahtarı kod içinde hardcode etmek. Makine dilinde derlemesi kolay olan yazılımda, anahtarı bulmak birkaç dakika alır.
Hata 2: Aynı anahtarı tüm okuyucular için kullanmak. Bir okuyucudan anahtar sızdırılırsa, tüm sisteminiz çöker.
Hata 3: Şifreleme olmadan iletişim yapmak. Okuyucu şifreli veriyi de şifrelemeden sunucuya gönderse, ortadaki adam (man-in-the-middle) saldırısına açık hale gelir.
Hata 4: Eski şifreleme algoritmaları (DES, MD5) kullanmak. Bunlar artık kırılmıştır. Mutlaka AES tercih edin.
Özet
Geçiş kontrol sistemini kurarken, kart verisi şifrelemeyi hafif almayın. Okuyucuda verileri AES ile şifreleyin, anahtarları güvenli biçimde yönetin ve bellekleri dikkatli temizleyin. Her okuyucu için farklı anahtarlar kullanın, bunları periyodik olarak döndürün ve sunucu iletişimini de şifreleyin. İlk kurulumda biraz daha zaman alırsa da, sonrasında sisteminiz çok daha güvenli olur. Güvenlik, bir kez yanlış yapıldığında çok pahalıya mal olur.