2010-07-20 12 views
12

Ich migriere meinen PHP-Code zu Google App Engine - Java.
Also ich brauche ein Äquivalent von PHP-Crypt-Funktion in Java,
seit ich alle Passwörter der registrierten Benutzer
mit Crypt in meiner DB gespeichert habe.Entspricht der Crypt-Funktion von PHP in Java

Edit 1: Dies ist mein PHP-Code für die Verschlüsselung von Passwörtern:

$ password = "test123";
$ pwd = crypt ($ Passwort, $ Passwort);
echo $ pwd;

Ausgang ist (On Windows- sowie ein Linux-basierten Server auf HostMonser):
temjCCsjBECmU

Kann mir jemand geben equivalted Java-Code?
Ich habe mit
Message Klasse verschiedene Permutationen & Kombinationen ausprobiert, aber kann es nicht richtig machen ..

Edit 2:
Hier ist Beispielcode, die ich dachte funktionieren würde, aber nicht:

try { 
       { 
        String password = "test123"; 
        MessageDigest digest = MessageDigest.getInstance("MD5"); 
        byte[] passwordBytes = password.getBytes(); 

        digest.reset(); 
        digest.update(passwordBytes); 
        digest.update(passwordBytes); 
        byte[] message = digest.digest(); 

        StringBuffer hexString = new StringBuffer(); 
        for (int i=0; i < message.length; i++) 
        { 
         hexString.append(Integer.toHexString(
          0xFF & message[ i ])); 
        } 
        String encrypted = hexString.toString(); 
        System.out.println(encrypted); 
        } } catch (NoSuchAlgorithmException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
+1

Bitte sagen Sie mir, dass Sie nicht den Standard (DES) Kryptoalgorithmus verwenden ... es gibt einen Grund, warum moderne Unixen nicht mit dem Krypt-Dienstprogramm kommen - es wurde schon vorher gebrochen. –

+0

@Billy ONeal: Der PHP-Standard ist vom Betriebssystem abhängig. Unter Linux/BSD wird standardmäßig das gesalzene MD5 verwendet (außer bei wirklich alten Versionen). Neuere Versionen können sogar ein neueres Schema verwenden, wie zum Beispiel gesalzene SHA512. – Powerlord

+0

@Billy ONeal: Allerdings ist der Code, den dta * nur * gepostet hat, tatsächlich DES ... muss auf einem Windows-Rechner mit PHP 5.2 oder niedriger sein. – Powerlord

Antwort

4

Sie müssen wissen, was die Umsetzung von PHP Krypta verwendet worden ist (MD5 SHA256 SHA512??), Weil es mehrere sind, je nach Betriebssystem: http://php.net/manual/fr/function.crypt.php

Die Java-Äquivalent Klasse MessageDigest ist. Wenn Sie eine Instanz dieser Klasse erstellen, bieten Sie den Hash-Algorithmus, zum Beispiel:

MessageDigest md = MessageDigest.getInstance("MD5"); 
MessageDigest md2 = MessageDigest.getInstance("SHA-256"); 
MessageDigest md3 = MessageDigest.getInstance("SHA-512"); 
// etc. 
byte[] encryptedPassword = md.digest("yourPassword".getBytes()); 
+0

Diese PHP-Handbuchseite ist in französischer, englischer Version hier: http://php.net/manual/en/function.crypt.php – Powerlord

+0

Es tut mir leid. Danke für die Korrektur. Da ich Franzose bin, habe ich nicht bemerkt, als ich die Antwort gepostet habe. –

+1

Wie wäre es Krypta mit einer Krypta Schlüssel? Gibt es eine Möglichkeit, einen Kryptschlüssel in Java zu verwenden, wie in PHP? Zum Beispiel crypt ($ password, "test") würde anders verschlüsseln als crypt ($ password) in php ... –

0

Nun, PHP Krypta ist nicht wirklich Verschlüsselung, soweit ich weiß. Es ist nur ein Wrapper um einige unidirektionale Hashing-Funktionen. Wenn Ihre aktuelle PHP-Site crypts MD5 oder SHA256 oder was auch immer verwendet, würde ich erwarten, dass Sie diese äquivalenten Hashing-Klassen/Funktionen in Java finden.

1

Sie benötigen einen Blick auf die java.security Klassen nehmen (was die JCE tbe verwendet):

Dort finden Sie alles, was Sie tun müssen (je nachdem, welchen Algorithmus Sie benötigen).

http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/package-summary.html

z.B. Message für MD5/SHA etc:

http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/MessageDigest.html

Schauen Sie sich diese gegen die Google App Engine Weiße Liste hier, ich bin nicht sicher, was unterstützt wird und was nicht.

http://code.google.com/appengine/docs/java/jrewhitelist.html

Die Java.Sicherheit Sachen ein bisschen nervig sein kann manchmal zu arbeiten, können Sie alternativ wollen Jasypt verwenden - das ist eine einfachere API ist, die mit jedem JCE funktioniert:

http://www.jasypt.org/

2

Es Sie scheint funktionieren mit Eine Legacy-Datenbank, die bereits mit Passwörtern gefüllt ist, die Sie nicht verwerfen können, können Sie nicht einfach switch to a salted MessageDigest verwenden, vorzugsweise mit SHA-1. Und Ihr Problem wird komplizierter, da die Krypta von PHP ein Wrapper ist, der might use one of several algorithms. Nehmen wir an, Ihr PHP verwendet die ursprüngliche DES-basierte UNIX-Krypta. Sie benötigen lediglich eine Java-Implementierung. Soweit ich weiß, gibt es in der Java-Standardinstallation keine UNIX-Krypta, aber für eine Liste von Optionen möchten Sie vielleicht look here.

+0

404 auf diesem Link ... – James

1

Die PHP-Krypta unterstützt mehrere Hash-Funktionen. Wenn Sie die MD5-Version (Hash beginnt mit $ 1 $) verwenden, können Sie eine Java-Implementierung finden Sie hier,

http://www.java2s.com/Open-Source/Java-Document/Groupware/LibreSource/md5/MD5Crypt.java.htm

Bitte beachten Sie, dass sie ihre eigene MD5-Klasse verwenden. Ich bin mir nicht sicher, ob es das gleiche wie Standard MD5 ist.

Ich bin sicher, dass Sie Java-Implementierung auch für andere Hash-Algorithmen finden können.

10

Dies ist ein alter Thread, aber ich stieß auf das gleiche Problem und fand eine andere Lösung. Sie können die UnixCrypt/Md5Crypt-Klassen in der Apache Commons Codec 1.7-Bibliothek verwenden.

Zum Beispiel können Sie rufen

UnixCrypt.crypt(string, salt) 

ODER

Md5Crypt.md5Crypt(byte[], salt) 

Ich habe nicht in die anderen Verschlüsselungstypen gesucht, aber ich denke, sie sind andere Dienstprogramme als auch.

+0

Dies ist die richtige Antwort ... danke – James

0

Ich kann empfehlen: MD5Crypt implementation

MD5Crypt.crypt("youPassword"); // output: $1$zSiw0koU$i3Srfmoxx4VPePJHWqAuK/ 

Dies ist eine der wenigen Implementierungen ist, was für mich funktioniert.