Java Academy · leksjon

Kryptografisk hashing med MessageDigest

Hash passord med SHA-256, legg til salt for å hindre regnbuetabellangrep og sammenlign digest-verdier på en sikker måte.

Leksjon 1 av 413 trinn

Kryptografisk hashing med MessageDigest er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva er kryptografisk hashing?

En kryptografisk hashfunksjon mapper data av vilkårlig størrelse til en hashverdi med fast størrelse. Den er enveis (kan ikke reverseres), deterministisk og kollisjonsresistent. Den brukes til lagring av passord, dataintegritet og digitale signaturer.

MessageDigest API

MessageDigest.getInstance("SHA-256") returnerer en SHA-256-hashfunksjon. Kall digest(bytes) for å beregne hashen og få en byte-tabell.

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

Vanlige algoritmer

JDK støtter: MD5 (knekt — aldri bruk den til sikkerhet), SHA-1 (frarådes av sikkerhetshensyn), SHA-256 (standard), SHA-512 (sterkere) og SHA3-256 (moderne). Bruk alltid SHA-256 eller SHA-512 i ny kode.

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

Konvertering av hash til heksadesimal streng

Resultatet i form av en byte-tabell må konverteres til en heksadesimal streng for lagring eller sammenligning. Bruk HexFormat (Java 17+) eller String.format i eldre versjoner.

// 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();

Salt: Slik bekjemper De regnbuetabeller

En regnbuetabell kobler vanlige passord til hashverdiene deres. Salting legger til en tilfeldig verdi i hvert passord før hashing, slik at regnbuetabeller blir ubrukelige. Lagre saltet sammen med hashverdien.

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)

Hashing av passord — bruk BCrypt i stedet

SHA-256 med salt er bedre enn ren SHA-256, men er fortsatt rask — en angriper kan prøve milliarder av kombinasjoner per sekund. Bruk en treg KDF: BCryptPasswordEncoder (Spring Security), PBKDF2 eller Argon2 for passord.

// 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

Kontroll av filintegritet

Hash en fil for å oppdage korrupsjon eller manipulering. Sammenlign den beregnede hashverdien med en kjent, korrekt referanse.

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);

Sikker sammenligning av hashverdier

Bruk MessageDigest.isEqual() til sammenligning i konstant tid for å forhindre timingangrep. Bruk aldri String.equals() til sammenligning av hashverdier.

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

Kjedeoppdateringer

Kall md.update(bytes) flere ganger før md.digest() for å hashe data som kommer i deler (strømming).

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

Koding av hashverdier for lagring

Lagre binære hashverdier som Base64 (kortere enn heksadesimal) eller som heksadesimale strenger. Base64 bruker 43 tegn for SHA-256, mot 64 tegn med heksadesimal koding. Begge deler er korrekt — vær konsekvent.

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

DigestInputStream for strømming

Pakk en InputStream inn i DigestInputStream for å beregne hashen mens De leser — da unngår De å laste hele filen inn i minnet.

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());

Hurtigsjekk

Hvorfor anbefales fortsatt ikke SHA-256 med salt til lagring av passord?

Oppsummering

Bruk MessageDigest.getInstance("SHA-256") til kontroll av dataintegritet. Salt alltid passord — men bruk BCrypt eller Argon2 til lagring av passord, ikke ren SHA. Bruk sammenligning i konstant tid (MessageDigest.isEqual) for å forhindre timingangrep.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Kryptografisk hashing med MessageDigest» gratis?

Ja – hele teksten i «Kryptografisk hashing med MessageDigest» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Kryptografisk hashing med MessageDigest»?

Hash passord med SHA-256, legg til salt for å hindre regnbuetabellangrep og sammenlign digest-verdier på en sikker måte. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Kryptografisk hashing med MessageDigest»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Kryptografisk hashing med MessageDigest
  2. Symmetrisk AES-kryptering
  3. HMAC-SHA256 for meldingsintegritet
  4. JWT: struktur, opprettelse og verifisering
← Tilbake til Java Academy