2010-07-20 13 views
12

Przenoszę mój kod PHP do Google App Engine - Java.
Potrzebuję więc odpowiednika funkcji krypt PHP w Javie,
, ponieważ przechowuję wszystkie hasła zarejestrowanych użytkowników
przy użyciu krypty w moim DB.Odpowiednik funkcji krypt PHP w Javie

Edycja 1: Oto mój kod php do szyfrowania haseł:

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

Wyjście jest (Na systemu Windows oraz jako serwer oparty na Linuksie na HostMonser):
temjCCsjBECmU

Czy ktoś może mi dać equivalted kodu Java?
próbowałem różnych permutacji & połączona z
MessageDigest klasy, ale nie może zrobić to dobrze ..

Edycja 2:
Oto przykładowy kod, który myślałem, że działa, ale nie:

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

Proszę mi powiedzieć, że nie korzystasz z domyślnego algorytmu szyfrowania DES. Jest powód, dla którego współczesny unixen nie jest wyposażony w narzędzie do szyfrowania - zostało wcześniej uszkodzone. –

+0

@Billy ONeal: domyślna wartość PHP zależy od systemu operacyjnego. W systemie Linux/BSD domyślnie jest to zasolony MD5 (z wyjątkiem naprawdę starych wersji). Nowsze wersje mogą nawet używać nowszego schematu, np. Solonego SHA512. – Powerlord

+0

@Billy ONeal: Jednak kod, który dta * właśnie * opublikował, rzeczywiście jest DES ... musi być na maszynie z Windows z PHP 5.2 lub niższym. – Powerlord

Odpowiedz

4

Trzeba wiedzieć, co realizacja PHP krypty zostały wykorzystane (MD5 SHA512 SHA256??), Bo jest ich kilka, w zależności od używanego systemu operacyjnego: http://php.net/manual/fr/function.crypt.php

Odpowiednik klasy Java jest MessageDigest. Podczas tworzenia instancji tej klasy, należy podać algorytmu skrótu, na przykład:

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

Ta strona podręcznika PHP jest w języku francuskim, wersja angielska tutaj: http://php.net/manual/en/function.crypt.php – Powerlord

+0

Przykro mi. Dziękuję za poprawienie mnie. Ponieważ jestem Francuzem, nie zauważyłem, kiedy opublikowałem odpowiedź. –

+1

Co powiesz na kryptę z kluczem krypty? Czy jest jakiś sposób użycia klucza krypt w java, tak jak w php? Na przykład krypta ($ hasło, "test") szyfrowałaby inaczej niż krypta ($ hasło) w php ... –

0

Crypt PHP nie jest tak naprawdę szyfrowaniem, o ile wiem. To jest po prostu owijka wokół niektórych jednokierunkowych funkcji mieszających, więc jeśli twoja obecna strona PHP używa MD5 lub SHA256 krypta, czy cokolwiek innego, spodziewałbym się, że możesz znaleźć te równoważne klasy/funkcje w Javie.

1

Trzeba przyjrzeć klas java.security (co kiedyś TBE tej jednostki):

Tam znajdziesz wszystko, czego potrzebujesz, aby zrobić to, co chcesz (w zależności od tego, jakiego algorytmu potrzebujesz).

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

np MessageDigest MD5/SHA dla etc:

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

sprawdzić te przeciwko Google App Engine białej listy tutaj, nie jestem pewien, co jest obsługiwana, a co nie jest.

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

Java.rzeczy bezpieczeństwa może być trochę uciążliwe do pracy z czasem, można alternatywnie chcesz użyć Jasypt - co jest bardziej uproszczony interfejs API, który współpracuje z dowolnym JCE:

http://www.jasypt.org/

2

Wydaje trzeba pracować z starsza baza danych zawiera już hasła, których nie można odrzucić, więc nie można po prostu switch to a salted MessageDigest, najlepiej używać SHA-1. A twój problem staje się bardziej skomplikowany, ponieważ krypta PHP jest opakowaniem, które jest might use one of several algorithms. Załóżmy jednak, że twój PHP wykorzystuje oryginalną kryptę UNIX opartą na DES, wtedy wszystko czego potrzebujesz to implementacja tego w Javie. O ile mi wiadomo, nie ma implementacji krypta UNIX w standardowej instalacji Java, ale może chcesz look here dla listy opcji.

+0

404 na tym łączu ... – James

10

To jest stary wątek, ale wpadłem na ten sam problem i znalazłem inne rozwiązanie. Możesz używać klas UnixCrypt/Md5Crypt w bibliotece Apache Commons Codec.

Na przykład można nazwać

UnixCrypt.crypt(string, salt) 

LUB

Md5Crypt.md5Crypt(byte[], salt) 

Nie wyglądał na innych typów szyfrowania, ale mogę sobie wyobrazić ich są inne narzędzia, jak również.

+0

To jest właściwa odpowiedź ... dzięki – James

0

mogę polecić to: MD5Crypt implementation

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

Jest to jeden z nielicznych wdrożeń, który pracuje dla mnie.