Gereksinimler ve Ön Hazırlık
Java Card geliştirmeye başlamadan önce, standart Java Development Kit (JDK) dışında özel araçlara ihtiyacınız vardır. Java Card Development Kit (JCDK), kart üzerindeki uygulamaları simüle etmenize ve derlemenize olanak tanır.
- Java Card Development Kit (JCDK): Oracle tarafından sağlanan, kart simülatörü ve derleyici araçlarını içeren paket.
- Java Card SDK: Hedef kartın desteklediği API sürümleri.
- IDE: Eclipse veya IntelliJ IDEA (Java Card eklentileri ile).
- Java Runtime Environment (JRE): En az 17 veya 21 sürümü önerilir.
Kurulum sırasında, ortam değişkenlerinize (Environment Variables) SDK yolunu eklemeyi unutmayın. Bu, derleme sırasında gerekli kütüphanelerin bulunmasını sağlar.
Java Card Applet Yapısı ve Yaşam Döngüsü
Java Card uygulamaları, javacard.framework.Applet sınıfından türetilir. Bir applet, kartın işletim sistemi tarafından yönetilen belirli bir yaşam döngüsüne sahiptir. Bu döngü; kurulum (install), seçim (select), işleme (process) ve kaldırma (deselect) aşamalarından oluşur.
Aşağıdaki kod örneği, temel bir Java Card uygulamasının iskeletini göstermektedir:
package com.egitim.akillikart;
import javacard.framework.*;
public class BasitApplet extends Applet {
protected BasitApplet() {
register(); // Applet'i kart işletim sistemine kaydeder
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new BasitApplet();
}
public void process(APDU apdu) {
if (selectingApplet()) return; // Kart seçildiğinde işlem yapma
byte[] buffer = apdu.getBuffer();
// APDU komutlarını burada işleyeceğiz
}
}
install metodu, kartın uygulamayı oluşturduğu ilk aşamadır. process metodu ise kart dış dünyadan (terminal) bir komut aldığında tetiklenen ana merkezdir.
APDU (Application Protocol Data Unit) İletişimi
Akıllı kartlar ile iletişim, APDU adı verilen bir protokol üzerinden gerçekleşir. Komut APDU'su (C-APDU) ve Cevap APDU'su (R-APDU) olmak üzere iki ana yapı vardır. Bir C-APDU; CLA (Sınıf), INS (Talimat), P1, P2 (Parametreler), Lc (Veri uzunluğu), Data ve Le (Beklenen cevap uzunluğu) alanlarından oluşur.
Aşağıdaki kodda, gelen bir komutun INS değerine göre nasıl ayrıştırılacağını görebilirsiniz:
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
// CLA kontrolü
if (buffer[ISO7816.OFFSET_CLA] != (byte) 0xB0) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (buffer[ISO7816.OFFSET_INS]) {
case (byte) 0x10: // Veri okuma komutu
okuVeri(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
Bu yapı, kartınızın dış dünyayla nasıl konuşacağını belirler. ISOException, hata durumlarını terminale bildirmek için kullanılan kritik bir sınıftır.
Veri Saklama ve Güvenlik Uyarıları
Java Card üzerinde veri saklarken, standart Java'daki gibi String veya Object kullanımı sınırlıdır. Bellek (EEPROM/RAM) yönetimi çok kritiktir. Verileri byte[] dizilerinde saklamalı ve "Transient" (geçici) veya "Persistent" (kalıcı) bellek ayrımına dikkat etmelisiniz.
Kritik Güvenlik Uyarısı: Java Card üzerinde hassas verileri (şifreler, anahtarlar) saklarken asla düz metin (plain text) kullanmayın. javacard.security paketindeki AES, RSA veya ECC algoritmalarını kullanarak verileri şifreleyin. Ayrıca, kartın "Side-Channel" saldırılarına karşı korunması için her zaman güncel SDK sürümlerini tercih edin.
Veri saklama yöntemlerini karşılaştıran tablo aşağıdadır:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Persistent (EEPROM) | Kart kapansa bile veri silinmez | Yazma ömrü sınırlıdır |
| Transient (RAM) | Çok hızlıdır, iz bırakmaz | Güç kesilince veri silinir |
Adım Adım Uygulama Geliştirme ve Test
Uygulamanızı geliştirdikten sonra, JCDK içerisindeki cref (Command Line Simulator) aracını kullanarak test edebilirsiniz. Test aşamasında, APDU komutlarını bir dosya içerisine yazıp simülatöre besleyebilirsiniz.
// Veri yazma metodu örneği
private void yazVeri(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short byteRead = apdu.setIncomingAndReceive();
// Gelen veriyi kalıcı belleğe kopyala
Util.arrayCopy(buffer, ISO7816.OFFSET_CDATA, veriDizisi, (short)0, byteRead);
}
Bu kod bloğu, dış dünyadan gelen veriyi alır ve kart üzerindeki kalıcı bir diziye yazar. Util.arrayCopy, bellek yönetimi için en güvenli yöntemdir.
Sıkça Sorulan Sorular
Java Card uygulamaları neden standart Java'dan farklıdır?
Java Card, sınırlı işlemci gücü ve belleğe sahip cihazlar için optimize edilmiştir. Bu yüzden Java'nın tüm kütüphanelerini (örneğin AWT, Swing, Collections) desteklemez.
Applet'i karta nasıl yüklerim?
Uygulama derlendikten sonra bir .cap dosyası oluşur. Bu dosya, GlobalPlatform standartlarını destekleyen bir kart yönetim aracı (örneğin GPShell) kullanılarak karta yüklenir.
Hangi şifreleme algoritmalarını kullanmalıyım?
Projenizin gereksinimine göre AES-128/256 (simetrik) veya RSA/ECC (asimetrik) algoritmalarını javacard.security kütüphanesi üzerinden kullanmanız önerilir.
Kart üzerindeki veriler nasıl silinir?
Veriler, Util.arrayFillKey metodu ile dizinin üzerine sıfır veya rastgele değerler yazılarak temizlenmelidir.
Java Card 3.x ile 2.x arasındaki fark nedir?
Java Card 3.x, "Connected" sürümü ile ağ yetenekleri ve daha büyük bellek yönetimi sunarken, 2.x daha çok klasik akıllı kartlar için optimize edilmiş temel bir sürümdür.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanılacak uygulamalarda mutlaka profesyonel bir güvenlik denetimi yapılmalı ve kartın donanımsal güvenlik standartları (EAL5+ gibi) göz önünde bulundurulmalıdır.
Java Card Uygulamalarında Performans Optimizasyonu ve Bellek Yönetimi
Java Card platformu, kısıtlı kaynaklara sahip (RAM ve EEPROM/Flash) mikrodenetleyiciler üzerinde çalışır. Standart Java'daki Garbage Collector mekanizması Java Card'da bulunmaz. Bu nedenle, bellek yönetimi geliştiricinin sorumluluğundadır.
Bellek Sızıntılarını Önleme Stratejileri
- Statik Nesne Tahsisi: Nesnelerinizi
install()metodu içerisinde bir kez oluşturun.process()metodu içerisindenewanahtar kelimesini kullanmaktan kaçının. - Geçici Bellek (Transient Memory): Verilerin karttan çıkarıldığında veya güç kesildiğinde silinmesini istiyorsanız
JCSystem.makeTransientByteArray()metodunu kullanın. Bu, EEPROM ömrünü uzatır. - Dizi Boyutlandırma: Dizilerinizi mümkün olan en küçük boyutta tanımlayın. Gereksiz büyük dizi tanımlamaları kartın bellek kapasitesini hızla tüketir.
// Doğru kullanım: install metodunda tanımlama
public class MyCardApplet extends Applet {
private byte[] buffer;
private MyCardApplet() {
buffer = new byte[32]; // Bellek bir kez ayrılır
register();
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new MyCardApplet();
}
}
Java Card Uygulamalarında Hata Ayıklama (Debugging) Teknikleri
Java Card üzerinde standart bir debugger kullanmak zordur. Hata ayıklama süreci genellikle APDU yanıt kodları (SW - Status Word) üzerinden yürütülür. Uygulamanızın hangi aşamada hata verdiğini anlamak için özel hata kodları tanımlamak en etkili yöntemdir.
Özel Hata Kodları ile İzleme
Uygulamanızda karşılaşılan mantıksal hataları, ISO 7816-4 standartlarına uygun özel SW kodları ile terminale iletebilirsiniz.
// Örnek: Hata yönetimi
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
// İşlem mantığı
if (buffer[ISO7816.OFFSET_P1] != 0x01) {
// Hatalı parametre durumunda özel bir hata kodu döndür
ISOException.throwIt((short) 0x6A86);
}
// Başarılı işlem
apdu.setOutgoingAndSend((short) 0, (short) 2);
}
Simülatör ve Donanım Arasındaki Farklar
Geliştirme aşamasında kullanılan simülatörler, donanımın tüm kısıtlamalarını (örneğin işlemci hızı veya belirli kriptografik algoritmaların donanımsal hızlandırıcıları) tam olarak yansıtmayabilir. Bu nedenle, yazılımınızı mutlaka hedeflediğiniz gerçek akıllı kart üzerinde "on-card" testlerine tabi tutmalısınız. Özellikle APDU iletişim hızları ve EEPROM yazma gecikmeleri, simülatör ile gerçek kart arasında farklılık gösterebilir.
| Özellik | Simülatör | Gerçek Kart |
|---|---|---|
| Bellek Yönetimi | Sınırsız (Host RAM) | Çok Kısıtlı (EEPROM/RAM) |
| Hata Ayıklama | Kolay (Breakpoint) | Zor (SW Kodları/Loglama) |
| Kriptografi | Yazılımsal | Donanımsal Hızlandırıcı |
Sonuç
Java Card ile akıllı kart uygulaması geliştirmek, düşük seviyeli bellek yönetimi ve yüksek güvenlik disiplini gerektiren zorlu ama ödüllendirici bir süreçtir. Bu rehberde, bir applet'in temel iskeletini kurmayı, APDU protokolü ile iletişim kurmayı ve verileri güvenli bir şekilde yönetmeyi öğrendiniz. Bir sonraki adım olarak, GlobalPlatform spesifikasyonlarını inceleyerek kart üzerinde "Secure Channel Protocol" (SCP) uygulamasını geliştirmeyi deneyebilirsiniz. Başarılar dilerim.


Yorumlar (0)
Yorum Yaz