[PHP] Java Class omzetten naar PHP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • PaulEm
  • Registratie: Januari 2008
  • Laatst online: 03-02 07:52
Op sourceforge loopt een project waar ik een web-based pagina aan wil koppelen. Via PHP moet ik dus kunnen inloggen op de user tabel van dat systeem.
Nu staat op hun wiki dat hun wachtwoorden gecodeerd met sha1, en vervolgens base64.

Dit is natuurlijk niet moeilijk te realiseren in PHP:
PHP:
1
$string = base64_encode(sha1('password'));


Echter krijg ik hiermee niet het zelfde wachtwoord...
Dus ik heb de source van het systeem doorgekeken, en ben uiteindelijk terecht gekomen bij het bestand die de wachtwoorden om zet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import javax.servlet.ServletException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

public final class CryptoSHA1BASE64 {
  public static String encriptar(String textoplano) throws ServletException {
    MessageDigest md = null;

    try {
      md = MessageDigest.getInstance("SHA"); // SHA-1 generator instance
    } catch(NoSuchAlgorithmException e) {
      throw new ServletException(e.getMessage());
    }

    try {
      md.update(textoplano.getBytes("UTF-8")); // Message summary generation
    } catch(UnsupportedEncodingException e) {
      throw new ServletException(e.getMessage());
    }

    byte raw[] = md.digest(); // Message summary reception
    String hash = (new BASE64Encoder()).encode(raw); // Encoding to BASE64
    return hash;
  }
}


Wat hier dus gebeurd is dat ze het wachtwoord eerst nog omzetten in UTF-8 bytes als ik het goed begrijp.
Dat is denk ik ook de reden waarom mijn wachtwoord niet gelijk is aan het wachtwoord in de database.
Echter zou ik nu niet weten hoe ik dit aanpak in PHP, want utf8_encode erover heen halen werkt:
PHP:
1
2
echo sha1('password') . "<br />";
echo sha1(utf8_encode('password'));


Output:
code:
1
2
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8


Ik hoop dat iemand mij op weg kan helpen hiermee, want ik kom op dit moment echt niet verder :'(

Paul

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ziet er niet toevallig ergens een salt waarde aan vastgeplakt? Dat zou wel moeten.

Acties:
  • 0 Henk 'm!

  • PaulEm
  • Registratie: Januari 2008
  • Laatst online: 03-02 07:52
Zoijar schreef op woensdag 04 februari 2009 @ 14:15:
Ziet er niet toevallig ergens een salt waarde aan vastgeplakt? Dat zou wel moeten.
Nope, dat zit hier niet bij aan. Wanneer ik een base64_decode over een wachtwoord doe krijg ik de volgende waarde terug:

code:
1
2
ºç&#8212;&#732;m)Ŝ«
ŸÕ³&#710;zûÖ&#732;òY


Dit heeft denk ik iets te maken met UTF8, want sha1 ziet er namelijk niet zo uit :+

Edit:Code wordt beetje vaag weergeven, maar sha1 ziet er in ieder geval niet zo uit met gekke tekens zoals: ç, û, Ŝ, « etc :9

[ Voor 12% gewijzigd door PaulEm op 04-02-2009 14:42 ]


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

PHP's sha1() functie retourneert de bytes in vorm van hexstring die je op jouw beurt base64 encode. Java's MessageDigest class retourneert alleen de rauwe bytes die direct base64 worden encoded.

Om in PHP dezelfde te krijgen als in Java moet je de van sha1() verkregen hexstring terug converteren naar bytes. Google eens op hex2bin voor voorbeelden. Hier staat iig eentje: http://www.php.net/bin2hex Je moet effectief dus base64_encode(hex2bin(sha1(password))) doen :)

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

PaulEm schreef op woensdag 04 februari 2009 @ 14:41:
Dit heeft denk ik iets te maken met UTF8, want sha1 ziet er namelijk niet zo uit :+
Bytes zijn niet humaan leesbaar. PHP is iets te vriendelijk naar developers toe door SHA1 als een hexstring te retourneren ipv een byte array (wat het daadwerkelijk moet zijn). De charset wordt normaliter gebruikt om de rauwe bytes te vertalen naar humaan leesbare karakters, echter is deze hier totaal niet van toepassing.

Acties:
  • 0 Henk 'm!

  • PaulEm
  • Registratie: Januari 2008
  • Laatst online: 03-02 07:52
BalusC schreef op woensdag 04 februari 2009 @ 14:59:
PHP's sha1() functie retourneert de bytes in vorm van hexstring die je op jouw beurt base64 encode. Java's MessageDigest class retourneert alleen de rauwe bytes die direct base64 worden encoded.

Om in PHP dezelfde te krijgen als in Java moet je de van sha1() verkregen hexstring terug converteren naar bytes. Google eens op hex2bin voor voorbeelden. Hier staat iig eentje: http://www.php.net/bin2hex Je moet effectief dus base64_encode(hex2bin(sha1(password))) doen :)
Dat zag er veelbelovend uit, echter krijg ik op jouw manier het volgende eruit:
code:
1
bae????????d???aab?d?fd?b????afbd???f???


Edit
Goh, zat verkeerde bestand aan te passen.. 8)7
Werkt perfect! Bedankt! :)

[ Voor 42% gewijzigd door PaulEm op 04-02-2009 15:15 ]


Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Graag gedaan :)

edit:
Ik zit zojuist in de sha1 manual te kijken en ik zie dat er sinds PHP5 een parameter is om de output te bepalen: http://www.php.net/sha1 Ik zou maar eerder daarvan gebruik gaan maken :)

[ Voor 88% gewijzigd door BalusC op 04-02-2009 15:20 ]


Acties:
  • 0 Henk 'm!

  • PaulEm
  • Registratie: Januari 2008
  • Laatst online: 03-02 07:52
BalusC schreef op woensdag 04 februari 2009 @ 15:17:
Graag gedaan :)

edit:
Ik zit zojuist in de sha1 manual te kijken en ik zie dat er sinds PHP5 een parameter is om de output te bepalen: http://www.php.net/sha1 Ik zou maar eerder daarvan gebruik gaan maken :)
Thanks voor de aanvulling, werkt perfect! >:)

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Fijn dat het werkt, maar ik weet niet hoe ik die smiley moet interpreteren :)
Pagina: 1