Permalänk
Medlem

MD5 (eller SHA1) i Java SE

Hejsan!

Undrar om någon vet någon bra tutorial/kan beskriva hur det funkar med MD5 i Java? Har förstått att man måste använda MessageDigest. Har även sett något som heter Fast MD5 till java, men jag skulle helst villja använda det inbyggda.

Hittar tyvärr inget vettigt när jag googlar/kollar här på swec :/

Tack på förhand!

Permalänk
Medlem

kod ifrån : http://java.sun.com/j2se/1.4.2/docs/api/java/security/Message...

MessageDigest md = MessageDigest.getInstance("SHA"); try { md.update(toChapter1); MessageDigest tc1 = md.clone(); byte[] toChapter1Digest = tc1.digest(); md.update(toChapter2); ...etc. } catch (CloneNotSupportedException cnse) { throw new DigestException("couldn't make digest of partial content"); }

Först så hämtar du instansen för hashen, sen så updaterar du hashen med updateringsfunktionerna, vilket kräver byte data, och sen beräknar du den slutgilitga hashen med digest() funktionen.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Jo, det har jag också läst, men det är inte särkilt pedagogiskt skrivet... hur får jag ut en string eller liknande med hashen sen då?? Jag kan inte hitta nån metod som verkar vara givande :/

Permalänk
Medlem

efter en snabb titt i API:t så antar jag att du får det med getAlgorithm()

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kd35a
Jo, det har jag också läst, men det är inte särkilt pedagogiskt skrivet... hur får jag ut en string eller liknande med hashen sen då?? Jag kan inte hitta nån metod som verkar vara givande :/

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html...()

De flesta typer i Java har någon getBytes() funktion.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

getBytes() finns inte till MessageDigest, och getAlgorithm() ger t ex "SHA"

Är det någon som har arbetat med md5 i java? För det verkar tydligen inte vara helt enkelt tyvärr, rena kinesiskan iaf om man inte är insatt i krypering. Mycket enklare med PHP: md5("en string"), så fick man hashen som svar

Eller ska man skriva sin egen algorithm genom att följa http://en.wikipedia.org/wiki/MD5#Pseudocode

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kd35a
getBytes() finns inte till MessageDigest, och getAlgorithm() ger t ex "SHA"

Är det någon som har arbetat med md5 i java? För det verkar tydligen inte vara helt enkelt tyvärr, rena kinesiskan iaf om man inte är insatt i krypering. Mycket enklare med PHP: md5("en string"), så fick man hashen som svar

Eller ska man skriva sin egen algorithm genom att följa http://en.wikipedia.org/wiki/MD5#Pseudocode

Läste fel, trodde du ville ha ut strängdatan som bytes, därav getBytes(). Digest funktionen till MessageDigest returnerar en byte array som du sedan får skapa en sträng av.
Läs dokumentationen om funktionerna.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

hmm råkade bli två inlägg, klickade på ändra

Visa signatur

Stationär: Ubuntu GB DQ6 P35 | Q6600 | 4GB ram Corsair 2*2gb 800mhz (3.5gb) |1tb SATA + 500gb SATA + 250gb SATA | Sparkle 9800gt Passiv
Laptop: Lenovo 3000 v200 | Ubuntu |

Permalänk
Medlem

Här har du koden !

public void md5Maker(String msg) throws Exception { MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(msg.getBytes()); byte bytes[] = digest.digest(); StringBuffer hex = new StringBuffer(); for (int i = 0; i <= bytes.length - 1; i++) { hex.append(Integer.toHexString(0xFF & bytes[i])); } msg = hex + ""; System.out.println("MD5:" + msg); }

ifall du vill ha SHA
java.security.MessageDigest.getInstance("SHA");

Visa signatur

Stationär: Ubuntu GB DQ6 P35 | Q6600 | 4GB ram Corsair 2*2gb 800mhz (3.5gb) |1tb SATA + 500gb SATA + 250gb SATA | Sparkle 9800gt Passiv
Laptop: Lenovo 3000 v200 | Ubuntu |

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sockan
Här har du koden !

public void md5Maker(String msg) throws Exception { MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(msg.getBytes()); byte bytes[] = digest.digest(); StringBuffer hex = new StringBuffer(); for (int i = 0; i <= bytes.length - 1; i++) { hex.append(Integer.toHexString(0xFF & bytes[i])); } msg = hex + ""; System.out.println("MD5:" + msg); }

ifall du vill ha SHA
java.security.MessageDigest.getInstance("SHA");

Tack! precis vad jag behövde Funkar till 99% får sätta mig ner och kolla på koden nu (skriver inte ut inledande 0or, testa t ex att hasha "hejsan". tycker det lättaste sättet att lära sig är att antingen läsa tutorial, eller en fungerande kod, och kolla i API för vad det är som sker.

Stort tack Sockan!

edit: blev ett litet fel..

Permalänk
Medlem

Värt att nämna i exemplet är att det också är hemskt platformsinkompatibelt (för att vara Java).

Då man använder getBytes() på strängen som ska hash:as så anvandlas strängen till bytes i det format som betraktas som "standard" på den platform man kör.

Skulle man till exempel med texten "häj" på Windows så skulle getBytes() returnera en codepage 1252-bytearray medans jag på min Ubuntu-maskin skulle få en bytearray med strängen i UTF-8.

Så, ange gärna enkodning i getBytes() för att försäkra dig om att resultatet blir detsamma.

//C

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av conio
Värt att nämna i exemplet är att det också är hemskt platformsinkompatibelt (för att vara Java).

Då man använder getBytes() på strängen som ska hash:as så anvandlas strängen till bytes i det format som betraktas som "standard" på den platform man kör.

Skulle man till exempel med texten "häj" på Windows så skulle getBytes() returnera en codepage 1252-bytearray medans jag på min Ubuntu-maskin skulle få en bytearray med strängen i UTF-8.

Så, ange gärna enkodning i getBytes() för att försäkra dig om att resultatet blir detsamma.

//C

Hmm, ok, det var intresant... tack för tipset iaf nån mer som kan något?? kan ju vara bra även för andra att lära sig, om man tex ska skicka lösenord över nätverk som mitt fall är.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av conio
Värt att nämna i exemplet är att det också är hemskt platformsinkompatibelt (för att vara Java).

Då man använder getBytes() på strängen som ska hash:as så anvandlas strängen till bytes i det format som betraktas som "standard" på den platform man kör.

Skulle man till exempel med texten "häj" på Windows så skulle getBytes() returnera en codepage 1252-bytearray medans jag på min Ubuntu-maskin skulle få en bytearray med strängen i UTF-8.

Så, ange gärna enkodning i getBytes() för att försäkra dig om att resultatet blir detsamma.

//C

Sorry...
digest.update(msg.getBytes("iso-8859-1"));

ändra bara på det så ska det fungera med ÅÄÖ

Visa signatur

Stationär: Ubuntu GB DQ6 P35 | Q6600 | 4GB ram Corsair 2*2gb 800mhz (3.5gb) |1tb SATA + 500gb SATA + 250gb SATA | Sparkle 9800gt Passiv
Laptop: Lenovo 3000 v200 | Ubuntu |

Permalänk

Håller på med ett krypteringssystem som projektarbete och tänkte använda mig av just MD5 för att kunna få unika värden på lösenorden, och variera just krypteringsnyckeln efter den hexadecimala sträng MD5 ger. Kommer det gå att konvertera den hexadecimala delen till någon slags integer som är unik för nyckeln, eller blir den för lång?
Var tänkt att antalet förskjutningar/char skulle bero på MD5-värdet, men jag kan dessvärre inte komma på något bra sätt att lösa det på

lite mer On Topic:
Tack för både förklaring av koden och länken med pseudokoden, precis vad jag behövde

Visa signatur

[AMD Athlon64 4400+ ][Geforce 8800GTS][ASUS M4N-SLI]
[3x300gb i RAID0, 500 gig och en 74gb raptor = 1474 GB]