[JAVA] Hoe komt hash tot stand?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dygnus
  • Registratie: Mei 2008
  • Laatst online: 06-08 15:41
Hoi allen,

Op het moment ben ik probeer ik een webinterface te koppelen aan een java-applicatie. Deze applicatie schrijft alle data weg in MySQL, dus een eitje voor mij om dan met PHP te werken. Maar het probleem ligt hiervoor niet bij PHP.

De applicatie schrijft wachtwoorden met de onderstaande functie weg. Nu wil ik dat men via de webinterface in kunnen loggen met dezelfde account als de applicatie. Hiervoor moet ik de totstandkoming van de hash/wachtwoord in PHP herschrijven (dat gaat wel lukken), maar kan iemand mij uitleggen hoe onderstaande hash tot stand komt in Java:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public String encrypt(String string) {
  try {
    final MessageDigest m = MessageDigest.getInstance("MD5");
    final byte[] bytes = string.getBytes();
    m.update(bytes, 0, bytes.length);
    final BigInteger i = new BigInteger(1, m.digest());
    
    return String.format("%1$032X", i).toLowerCase();
  } catch (final Exception e) {
  }
  
  return "";
}


Ter verduidelijking, ik vraag niet hoe ik deze hash kan decrypten (dat is gewoon weg niet mogelijk met MD5), maar ik moet weten hoe deze totstand komt om vervolgens in PHP te herschrijven om te vergelijken.

Alvast bedankt voor jullie tijd!

Acties:
  • 0 Henk 'm!

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 13-10 14:20
PHP Heeft toch gewoon md5 hash functies?

Anders staat hier een stukje code hoe de MD5-hash werkt: Wikipedia: MD5

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


Acties:
  • 0 Henk 'm!

  • dygnus
  • Registratie: Mei 2008
  • Laatst online: 06-08 15:41
Dat is het probleem niet, PHP ken ik wel (werk er 5 jaar mee). Maar er zit nog een hash in voordat het wachtwoord naar MD5 wordt weggeschreven.

Zie stukje:

Java:
1
String.format("%1$032X", i)

[ Voor 19% gewijzigd door dygnus op 12-08-2011 13:19 ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 12-10 15:22

CoolGamer

What is it? Dragons?

De functie voegt zelf geen hash toe. Weet je zeker dat die string bij aanroep niet al een SALT bevat?

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

1e hit op google:
http://www.google.com/sea....format+%22%251%24032X%22
>> http://snippets.dzone.com/posts/show/3686

The .format there converts it into a 0 padded 32 hex number.

[ Voor 8% gewijzigd door Creepy op 12-08-2011 14:57 . Reden: LMGTFYT is nogal kinderachtig. ]

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 22:20
De MD5 hash wordt berekend.
Daar wordt dan een Integer van gemaakt.
Deze wordt naar String geconverteerd dmv de opgegeven format. Meer uitleg hier

Java:
1
String.format("%1$032X", i)


%[argument_index$][flags][width][.precision]conversion

Uitleg:
%[argument_index$] = %1$
[flags] = 0
[width] = 32
[.precision] =
conversion = X

Dus:
-'flag' voor zero padded
-lengte 32
-formatted as hexidecimal string

let the past be the past.


Acties:
  • 0 Henk 'm!

  • dygnus
  • Registratie: Mei 2008
  • Laatst online: 06-08 15:41
Super @SPee dat moest ik hebben! Nu kan ik hem met volle zekerheid goed herbouwen. Tx :)

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
BTW: let goed op: String.getBytes() gebruikt de default encoding van het platform om de String om te vormen naar bytes. Voor een correcte afleiding van de MD5 zul je dus moeten weten wat de default encoding was op de server waarmee de hash werd gegenereerd.
De oorspronkelijke schrijver van deze encrypt functie had beter expliciet de characterset moeten opgeven met getBytes(encoding)

Tekens die buiten deze characterset vallen worden namelijk (bijna altijd) omgezet naar de byte voor '?' (0x3F)!

Bijvoorbeeld als de default encoding windows-1252 is, en de input string een character uit UTF-8 bevat die niet in windows-1252 zit zoals bijvoorbeeld
U+01B5 Ƶ c6 b5 LATIN CAPITAL LETTER Z WITH STROKE
Dan wordt de hash anders, dan als de default encoding UTF-8 zou zijn!

Dit geldt trouwens ook voor karakters die wel in de karakterset zitten. De hash in windows-1252 zal anders zijn dan in UTF-8 voor alle karakters buiten de ASCII set (0x00 t/m 0x7F), aangezien die in UTF-8 met 2 of meer bytes gecodeerd worden.

[ Voor 13% gewijzigd door Remus op 12-08-2011 15:00 ]

Pagina: 1