geri

Parolalarımızı tuzlayarak saklayalım ki bozulmasınlar

27/08/2012
6 Haziran 2012 günü 6.46 milyon LinkedIn parolasının ele geçirildiği haberi teknoloji kulislerine bomba gibi düştüğünde bir LinkedIn kullanıcı olarak aslında çok fazla endişelenmemiştim.

Çünkü her düzgün teknoloji/bilişim şirketi gibi LinkedIn'in de parolaların tuz(salt) kullanarak hesapladığı özetlerini sakladığından emindim. Parolalara göz gezdirdiğimde açık olarak değil özet olarak saklandıklarını fark ettiğimde daha da rahatlamıştım.

Kısa süre sonra parolalardan zayıf olanlarının kırıldığı haberleri dolaşmaya başladı. Tuz kullanmadan hesaplanan özetlerin kırılması kolaydı. Bu uzun zamandan beri bilinen bir durumdu. Yoksa LinkedIn parolaların özetlerini tuz kullanmadan mı hesaplamıştı? Kara haber tez duyuldu. Benim parolam da kırılan parolalar arasındaydı ve parolamı değiştirmem gerekti.

Parola özeti nedir?

SHA-1 gibi özet fonksiyonları bir kümeden başka bir kümeye tek yönlü izdüşüm sağlarlar. Daha açık anlatmak gerekirse yukarıdaki resimde olduğu gibi SHA-1 fonksiyonu her bir parola için farklı bir özet değeri hesaplar. Bu fonksiyon tek yönlü olduğu için özet değerinden parola değeri geri elde edilemez. Böylece parolanın güvenliği sağlanmış olur.

Aşağıda istenen input için SHA-1 özetini döndüren Java dilinde kodlanmış bir fonksiyon yer alıyor.

public String sha1Hash(final String input) throws NoSuchAlgorithmException {
  MessageDigest m = MessageDigest.getInstance("SHA-1");
  byte[] out = m.digest(input.getBytes());
  final StringBuilder sb = new StringBuilder();
  for (final byte mdbyte : out) {
    sb.append(Integer.toString((mdbyte & 0xff) + 0x100, 16).substring(1));
  }
  return sb.toString();
}

Tuz kullanmadan özet hesaplarsak ne olur?

SHA-1 özeti ile parolamızın güvenliği sağlanmış olur dedik ancak yeterli işlem gücü ve zamanı verilirse parola kümesindeki tüm elemanlar için özet değeri hesaplanarak bir tabloda saklanabilir demeyi unuttuk. Bu tablo oluşturulduğunda verilen özet değerine karşılık gelen parola doğrudan elde edilebilir. SHA-1 lookup sitesi bu hizmeti ücretsiz olarak sağlamaktadır. Aşağıdaki bağlantılara tıklarsanız test, test1 ve test2 parolalarına özet değerlerinden ulaşabileceğinizi göreceksiniz.

Sorunu aşmak için tuzlama yöntemini kullanacağız.

Verilen parolaya rastgele üretilecek tuz adını verdiğimiz bir karakter dizisi ekleyip elde ettiğimiz sonucun özetini hesaplarsak parolamızın önceden hesaplanma olasılığını çok aza indirebiliriz.

Aşağıdaki Java fonksiyonu rastgele tuz üretmektedir.

public static String generateSalt() {
  StringBuilder salt = new StringBuilder();
  java.util.Random randgen = new SecureRandom();
  while (salt.length() < 8) {
    int index = (int) (randgen.nextFloat() * SALTCHARS.length());
    salt.append(SALTCHARS.substring(index, index + 1));
  }
  return salt.toString();
}

Yukarıdaki SHA-1 fonksiyonunun bir tuz değerini parametre olarak alan hali aşağıda yer alıyor.

public String sha1Hash(final String input, final String salt) throws NoSuchAlgorithmException {
  MessageDigest m = MessageDigest.getInstance("SHA-1");
  byte[] out = m.digest((input + salt).getBytes());
  final StringBuilder sb = new StringBuilder();
  for (final byte mdbyte : out) {
    sb.append(Integer.toString((mdbyte & 0xff) + 0x100, 16).substring(1));
  }
  return sb.toString();
}

test parolasının a1235kl7 tuz değeri ile hesaplanan özeti 6c60701153162e4ef26298ee6de2ca5f1f3460ce olur. Bu değer için SHA-1 lookup sitesinin çaresiz kaldığını buradan görebilirsiniz.

Tuz değeri nasıl saklanmalı?

Her bir parola için kullanılan tuz değerini veritabanında ya da bir dosyada açık halde rahatça saklayabilirsiniz. Daha sonra gerçekleştirilecek parola doğrulamalarında girdiye tuz değerini ekleyerek özet değerini hesapladıktan sonra bu değeri daha önce hesaplanan özet ile karşılaştırarak doğrulamayı gerçekleştirebilirsiniz.

Follow me on Twitter