2010-07-20 21 views
12

Sto migrando il mio codice PHP a Google App Engine - Java.
Quindi ho bisogno di un equivalente della funzione crypt di PHP in Java,
poiché ho memorizzato tutte le password degli utenti registrati
utilizzando la cripta nel mio DB.Equivalente della funzione crypt di PHP in Java

Edit 1: Ecco il mio codice php per le password crittografia:

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

uscita è (On di Windows così come un server basato su Linux su HostMonser):
temjCCsjBECmU

qualcuno può darmi il codice Java equivalted?
ho provato varie permutazioni & combinazioni con
classe MessageDigest, ma non può farlo bene ..

Edit 2:
Ecco il codice di esempio che ho pensato avrebbe funzionato, ma non lo feci:

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

Per favore dimmi che non stai usando l'algoritmo di criptaggio predefinito (DES) .... c'è una ragione per cui unix unixen non viene fornito con l'utilità crypt - è stato rotto prima. –

+0

@Billy ONeal: l'impostazione predefinita di PHP dipende dal sistema operativo. In Linux/BSD, per impostazione predefinita salted MD5 (tranne che per le versioni veramente vecchie). Le versioni più recenti possono anche utilizzare uno schema più recente, come lo SHA512 salato. – Powerlord

+0

@Billy ONeal: Tuttavia, il codice che dta * just * ha postato è effettivamente DES ... deve essere su una macchina Windows con PHP 5.2 o inferiore. – Powerlord

risposta

4

Dovete sapere che cosa implementazione di PHP cripta è stata usata (MD5 SHA256 SHA512???), Perché ci sono diversi, a seconda del sistema operativo: http://php.net/manual/fr/function.crypt.php

La classe equivalente Java è MessageDigest. Quando si crea un'istanza di questa classe, si fornisce l'algoritmo di hash, per esempio:

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

Questa pagina di manuale PHP è in francese, versione inglese qui: http://php.net/manual/en/function.crypt.php – Powerlord

+0

Mi dispiace. Grazie per la correzione. Dato che sono francese, non ho notato quando ho postato la risposta. –

+1

Che ne dici di crypt con una chiave di crittografia? C'è un modo di usare una chiave di crittografia in java, come faresti con PHP? Ad esempio crypt ($ password, "test") sarebbe crittografato diverso da crypt ($ password) in php ... –

0

Bene, la cripta di PHP non è in realtà la crittografia per quanto ne so. Credo che sia solo un involucro attorno ad alcune funzioni di hashing unidirezionali, quindi se il tuo attuale sito PHP usa l'MD5 o SHA256 di crypt o qualsiasi altra cosa, mi aspetterei che tu possa trovare quelle classi/funzioni di hashing equivalenti in Java.

1

è necessario prendere un'occhiata alle classi java.security (quello utilizzato per TBE ICC):

Lì troverai tutto ciò che ti serve per fare ciò che vuoi (a seconda dell'algoritmo di cui hai bisogno).

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

esempio MessageDigest per MD5/SHA etc:

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

controllare questi contro il Google App Engine whitelist qui, io non sono sicuro di quello che ha sostenuto e ciò che non lo è.

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

Java.roba di sicurezza può essere un po 'di dolore di lavorare con a volte, si può in alternativa da utilizzare Jasypt - che è un'API più semplificata che funziona con qualsiasi JCE:

http://www.jasypt.org/

2

Sembra si deve lavorare con un database precedente già popolato con password che non è possibile scartare, quindi non è possibile semplicemente switch to a salted MessageDigest, preferibilmente utilizzando SHA-1. E il tuo problema diventa più complicato, dato che la crypt di PHP è un wrapper che è might use one of several algorithms. Ma supponiamo che il tuo PHP utilizzi la cripta UNIX originale basata su DES, quindi tutto ciò che ti serve è una sua implementazione in Java. Per quanto ne so, non vi è alcuna implementazione della cripta di UNIX nell'installazione standard di Java, ma è possibile che si desideri look here per un elenco di opzioni.

+0

404 su quel link ... – James

10

Questa è una vecchia discussione ma ho riscontrato lo stesso problema e ho trovato una soluzione diversa. È possibile utilizzare le classi UnixCrypt/Md5Crypt nella libreria 1.7 Apache Commons Codec.

Per esempio è possibile chiamare

UnixCrypt.crypt(string, salt) 

O

Md5Crypt.md5Crypt(byte[], salt) 

Non ho guardato negli altri tipi di crittografia ma immagino loro sono altre utility come bene.

+0

Questa è la risposta giusta ... grazie – James

0

posso consiglio questo: MD5Crypt implementation

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

Questa è una delle poche implementazioni, che funziona per me.

Problemi correlati