Daha önce AES ile ilgili yazılarımda CBC ve ECB modlarında nasıl veri şifreleme yapabileceğimizden bahsetmiştim. Bu yazımda AES şifrelemede kullanacağımız anahtarı nasıl güvenlik altına alabileceğimize değineceğim.

Bu işlem için PBKDF2 algoritmasını kullanacağız. Bu sayede şifreleme için kullanacağımız anahtarı bir şifre ile farklılaştırmış olacağız. Bu sayede farklılaştırdığımız anahtarımızı şifreleme ve çözme işlemlerinde kullanacağız.

Bu sayede doğru şifre girilmeden anahtarlarımız oluşturulan şifreli verinin çözülmesinde kullanılamayacak. Anahtarlarınız ele geçse bile verileriniz güven altında olabilecek.

Anahtarı dönüştürme için kullanılacak şifrenin seçilmesinde verinin kimden gizlendiğine göre bir strateji belirlenmeli. Örnek olarak sadece kullanıcının okuyabileceği bir database kaydından bahsediyorsak burada kullanıcı şifresi kullanılabilir.

Anahtar oluşturma sırasında aşağıdaki gibi bir yol izlemeniz gerekiyor.

 /**
 * AES şifrelemede kullanacağımız key'i PKCS#5 standardına göre PBKDF2 methodu ile dönüştürüyoruz.
 *
 * @param keyBytes salt key byte dizisi.
 * @return dönüştürülmüş key byte dizisi.
 * @throws InvalidKeySpecException salt key dönüştürme için uygun değil.
 * @throws NoSuchAlgorithmException PBKDF2 algoritması sistemde kullanılabilir durumda değil.
 */
private static byte[] deriveKey(String password, byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
  // PBKDF2 dönüştürme için kullanacağımız factory objesini oluşturuyoruz.
  SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
  // Dönüştürülmüş key objesini oluşturuyoruz.
  KeySpec derivatedKeySpec = new PBEKeySpec(password.toCharArray(), keyBytes, 1024, 256);

  // Bu key'i AES operasyonları için hazırlıyoruz.
  return factory.generateSecret(derivatedKeySpec).getEncoded();
}

Hem şifreleme hem çözme işlemlerinde key byte dizisini önce bu method ile dönüştürmeniz gerekiyor. Örnek:

// Anahtar'ın byte dizisini şifre ile dönüştürelim.
byte[] derivedKey = deriveKey("pa5sw0rd", keyBytes);
// Key objelerimizi yaratalım.
SecretKeySpec keySpec = new SecretKeySpec(derivedKey, "AES");

Başka bir yazıda görüşmek üzere.