0Pricing
Java Academy · Ders

MessageDigest ile Şifreleme Özeti Oluşturma

Parolaları SHA-256 ile özetleyin, gökkuşağı tablosu saldırılarını önlemek için tuz ekleyin ve özetleri güvenli biçimde karşılaştırın.

MessageDigest ile Şifreleme Özeti Oluşturma, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Kriptografik Özetleme Nedir

Kriptografik bir özet işlevi, herhangi bir boyuttaki veriyi sabit boyutlu bir özete dönüştürür. Tek yönlüdür (geri döndürülemez), belirlenimcidir ve çakışmalara dayanıklıdır. Parola depolama, veri bütünlüğü ve dijital imzalar için kullanılır.

MessageDigest API'si

MessageDigest.getInstance("SHA-256"), bir SHA-256 özetleyicisi döndürür. Özeti hesaplamak ve bir bayt dizisi elde etmek için digest(bytes) çağrısını yapın.

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest("password123".getBytes(StandardCharsets.UTF_8));
String hex = HexFormat.of().formatHex(hash);
System.out.println(hex); // 64-char hex string

Yaygın Algoritmalar

JDK şunları destekler: MD5 (kırılmış — güvenlik için asla kullanmayın), SHA-1 (güvenlik açısından kullanımdan kaldırılmıştır), SHA-256 (standart), SHA-512 (daha güçlü), SHA3-256 (modern). Yeni kodlarda her zaman SHA-256 veya SHA-512 kullanın.

MessageDigest.getInstance("SHA-256");  // recommended
MessageDigest.getInstance("SHA-512");  // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically broken

Özeti Onaltılık Dizeye Dönüştürme

Bayt dizisi sonucu, depolama veya karşılaştırma için onaltılık bir dizeye dönüştürülmelidir. HexFormat (Java 17+) veya eski sürümlerde String.format kullanın.

// Java 17+:
String hex = HexFormat.of().formatHex(hash);
// Older Java:
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String hex = sb.toString();

Tuz: Gökkuşağı Tablolarını Etkisiz Kılma

Gökkuşağı tablosu, yaygın parolaları bunların özetleriyle eşleştirir. Tuzlama, özetleme öncesinde her parolaya rastgele bir değer ekleyerek gökkuşağı tablolarını işe yaramaz hâle getirir. Tuzu özetin yanında depolayın.

SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
byte[] hash = md.digest("password".getBytes(StandardCharsets.UTF_8));
// Store: Base64.encode(salt) + ":" + Base64.encode(hash)

Parola Özetleme — Bunun Yerine BCrypt Kullanın

Tuz içeren SHA-256, düz SHA-256'dan daha iyidir ancak hâlâ hızlıdır — saldırgan saniyede milyarlarca tahminde bulunabilir. Yavaş bir KDF kullanın: parolalar için BCryptPasswordEncoder (Spring Security) veya PBKDF2, Argon2.

// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // true

Dosya Bütünlüğünü Denetleme

Bozulmayı veya kurcalanmayı algılamak için bir dosyayı özetleyin. Hesaplanan özeti bilinen güvenilir bir başvuruyla karşılaştırın.

MessageDigest md = MessageDigest.getInstance("SHA-256");
try (InputStream is = Files.newInputStream(Path.of("app.jar"))) {
    byte[] buf = new byte[8192];
    int n;
    while ((n = is.read(buf)) > 0) md.update(buf, 0, n);
}
String hash = HexFormat.of().formatHex(md.digest());
System.out.println("SHA-256: " + hash);

Özetleri Güvenli Biçimde Karşılaştırma

Zamanlama saldırılarını önlemek için sabit süreli karşılaştırmada MessageDigest.isEqual() kullanın. Özet karşılaştırması için asla String.equals() kullanmayın.

byte[] expected = computeHash(storedHash);
byte[] actual   = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-time

Güncellemeleri Zincirleme

Parçalar hâlinde (akış olarak) gelen verileri özetlemek için md.digest() çağrısından önce md.update(bytes) çağrısını birden çok kez yapın.

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"

Özetleri Depolama İçin Kodlama

İkili özetleri Base64 (onaltılıktan daha kısa) veya onaltılık dizeler olarak depolayın. Base64, SHA-256 için onaltılığın 64 karakterine karşılık 43 karakter kullanır. İkisi de doğrudur — tutarlı olun.

byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex    = HexFormat.of().formatHex(hash);           // 64 chars

Akış İçin DigestInputStream

Okuma sırasında özeti hesaplamak için bir InputStream'i DigestInputStream ile sarın — böylece dosyanın tamamını belleğe yüklemek gerekmez.

MessageDigest md = MessageDigest.getInstance("SHA-256");
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), md)) {
    dis.transferTo(OutputStream.nullOutputStream());
}
String hash = HexFormat.of().formatHex(md.digest());

Hızlı Kontrol

Tuz içeren SHA-256, parola depolama için neden hâlâ önerilmez?

Özet

Veri bütünlüğü denetimleri için MessageDigest.getInstance("SHA-256") kullanın. Parolaları her zaman tuzlayın — ancak parola depolama için ham SHA yerine BCrypt/Argon2 kullanın. Zamanlama saldırılarını önlemek için sabit süreli karşılaştırma (MessageDigest.isEqual) kullanın.

Sıkça Sorulan Sorular

“MessageDigest ile Şifreleme Özeti Oluşturma” dersi ücretsiz mi?

Evet — “MessageDigest ile Şifreleme Özeti Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“MessageDigest ile Şifreleme Özeti Oluşturma” dersinde ne öğreneceğim?

Parolaları SHA-256 ile özetleyin, gökkuşağı tablosu saldırılarını önlemek için tuz ekleyin ve özetleri güvenli biçimde karşılaştırın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“MessageDigest ile Şifreleme Özeti Oluşturma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. MessageDigest ile Şifreleme Özeti Oluşturma
  2. AES Simetrik Şifreleme
  3. İleti Bütünlüğü için HMAC-SHA256
  4. JWT: Yapı, Oluşturma ve Doğrulama
← Java Academy Sayfasına Dön