Kryptografisk hashning med MessageDigest
Hasha lösenord med SHA-256, tillsätt salt för att förhindra rainbow table-attacker och jämför digestvärden säkert.
Kryptografisk hashning med MessageDigest är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad är kryptografisk hashning
En kryptografisk hashfunktion mappar data av valfri storlek till ett hashvärde med fast storlek. Den är envägsriktad (kan inte reverseras), deterministisk och kollisionsresistent. Den används för lösenordslagring, dataintegritet och digitala signaturer.
MessageDigest-API:t
MessageDigest.getInstance("SHA-256") returnerar en SHA-256-hashare. Anropa digest(bytes) för att beräkna hashen och få en bytearray.
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 stringVanliga algoritmer
JDK stöder följande: MD5 (knäckt – använd aldrig för säkerhet), SHA-1 (föråldrad av säkerhetsskäl), SHA-256 (standard), SHA-512 (starkare) och SHA3-256 (modern). Använd alltid SHA-256 eller SHA-512 i ny kod.
MessageDigest.getInstance("SHA-256"); // recommended
MessageDigest.getInstance("SHA-512"); // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically brokenKonvertera hash till hexsträng
Resultatet i form av en bytearray måste konverteras till en hexsträng för lagring eller jämförelse. Använd HexFormat (Java 17+) eller String.format i äldre versioner.
// 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();Saltning: Besegra regnbågstabeller
En regnbågstabell mappar vanliga lösenord till deras hashvärden. Saltning innebär att ett slumpmässigt värde läggs till varje lösenord före hashningen, vilket gör regnbågstabeller oanvändbara. Lagra saltet tillsammans med hashvärdet.
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)Hashning av lösenord – använd BCrypt i stället
SHA-256 med salt är bättre än vanlig SHA-256, men fortfarande snabb – en angripare kan prova miljarder gissningar per sekund. Använd en långsam KDF: BCryptPasswordEncoder (Spring Security), PBKDF2 eller Argon2 för lösenord.
// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // trueKontroll av filintegritet
Hasha en fil för att upptäcka korruption eller manipulering. Jämför den beräknade hashen med en känd korrekt referens.
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);Säker jämförelse av hashvärden
Använd MessageDigest.isEqual() för en jämförelse i konstant tid som förhindrar timingattacker. Använd aldrig String.equals() för att jämföra hashvärden.
byte[] expected = computeHash(storedHash);
byte[] actual = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-timeKedja uppdateringar
Anropa md.update(bytes) flera gånger före md.digest() för att hasha data som kommer i delar (strömmande data).
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"Koda hashvärden för lagring
Lagra binära hashvärden som Base64 (kortare än hex) eller som hexsträngar. Base64 använder 43 tecken för SHA-256, jämfört med 64 tecken för hex. Båda är korrekta – var konsekvent.
byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex = HexFormat.of().formatHex(hash); // 64 charsDigestInputStream för strömmande data
Omslut en InputStream med DigestInputStream för att beräkna hashen medan data läses – då behöver hela filen inte läsas in 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());Snabbkontroll
Varför rekommenderas SHA-256 med salt fortfarande inte för lösenordslagring?
Sammanfattning
Använd MessageDigest.getInstance("SHA-256") för kontroller av dataintegritet. Salta alltid lösenord – men använd BCrypt eller Argon2 för lösenordslagring, inte rå SHA. Använd en jämförelse i konstant tid (MessageDigest.isEqual) för att förhindra timingattacker.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Kryptografisk hashning med MessageDigest” gratis?
Ja – hela texten till ”Kryptografisk hashning med MessageDigest” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kryptografisk hashning med MessageDigest”?
Hasha lösenord med SHA-256, tillsätt salt för att förhindra rainbow table-attacker och jämför digestvärden säkert. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Kryptografisk hashning med MessageDigest”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Kryptografisk hashning med MessageDigest
- Symmetrisk AES-kryptering
- HMAC-SHA256 för meddelandeintegritet
- JWT: struktur, skapande och verifiering