2010-07-20 35 views
12

Tôi đang di chuyển mã PHP của mình sang Google App Engine - Java.
Vì vậy, tôi cần tương đương với chức năng mã hóa của PHP trong Java,
vì tôi đã lưu trữ tất cả mật khẩu của người dùng đã đăng ký
bằng cách sử dụng mật mã trong DB của tôi.Tương đương với chức năng mã hóa của PHP trong Java

Sửa 1: Đây là mã php của tôi cho các mật khẩu mã hóa:

$ password = "test123";
$ pwd = crypt ($ mật khẩu, $ mật khẩu);
echo $ pwd;

Output là (Trên của Windows cũng như dựa trên máy chủ Linux trên HostMonser):
temjCCsjBECmU

Có thể ai đó cho tôi mã java equivalted?
Tôi đã thử hoán vị khác nhau & kết hợp với
lớp MessageDigest, nhưng không thể làm cho nó đúng ..

Chỉnh sửa 2:
Đây là mẫu mã mà tôi nghĩ sẽ làm việc nhưng không:

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

Hãy cho tôi biết bạn không sử dụng thuật toán mã hóa mặc định (DES) .... có một lý do unixen hiện đại không đi kèm với tiện ích crypt - nó đã bị hỏng trước đó. –

+0

@Billy Oneal: Mặc định của PHP phụ thuộc vào hệ điều hành. Trên Linux/BSD, nó mặc định để muối MD5 (ngoại trừ trên các phiên bản thực sự cũ). Các phiên bản mới hơn thậm chí có thể sử dụng một lược đồ mới hơn, như là SHA512 có muối. – Powerlord

+0

@Billy ONeal: Tuy nhiên, mã mà dta * just * posted thực sự là DES ... phải nằm trên máy Windows có PHP 5.2 trở xuống. – Powerlord

Trả lời

4

Bạn cần phải biết những gì thực hiện PHP hầm mộ đã được sử dụng (MD5 SHA256 SHA512??) Bởi vì có một số, tùy thuộc vào hệ điều hành của bạn: http://php.net/manual/fr/function.crypt.php

Java lớp tương đương là MessageDigest. Khi bạn tạo một thể hiện của lớp này, bạn cung cấp các thuật toán băm, ví dụ:

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

Trang hướng dẫn sử dụng PHP bằng tiếng Pháp, phiên bản tiếng Anh tại đây: http://php.net/manual/en/function.crypt.php – Powerlord

+0

Tôi xin lỗi. Cảm ơn vì sự đúng đắn của bạn. Vì tôi là người Pháp, tôi không nhận thấy khi tôi đăng câu trả lời. –

+1

Làm thế nào về crypt với một khóa crypt? Có cách nào sử dụng một khóa mã hóa trong java, như bạn sẽ làm trong php? Ví dụ crypt ($ password, "test") sẽ mã hóa khác với crypt ($ password) trong php ... –

0

Vâng, mật mã của PHP không thực sự mã hóa theo như tôi biết. Nó chỉ là một trình bao bọc xung quanh một số hàm băm một chiều mà tôi tin, vì vậy nếu trang web PHP hiện tại của bạn đang sử dụng MD5 hoặc SHA256 của crypt hoặc bất kỳ thứ gì, tôi mong rằng bạn có thể tìm thấy các hàm/hàm băm tương đương trong Java.

1

Bạn cần phải có một cái nhìn tại các lớp java.security (những gì sử dụng để TBE JCE):

Trong đó bạn sẽ tìm thấy mọi thứ bạn cần để làm những gì bạn muốn (tùy thuộc vào thuật toán nào bạn cần).

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

ví dụ: MessageDigest cho MD5/SHA vv:

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

Kiểm tra này để tấn công Google App Engine danh sách trắng ở đây, tôi không chắc chắn những gì đang được hỗ trợ và những gì không.

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

java.công cụ bảo mật có thể là một chút đau để làm việc với đôi khi, bạn có thể cách khác muốn sử dụng Jasypt - đó là một API đơn giản hơn là làm việc với bất kỳ JCE:

http://www.jasypt.org/

2

Có vẻ như bạn phải làm việc với cơ sở dữ liệu cũ đã được điền bằng mật khẩu bạn không thể hủy, vì vậy bạn không thể chỉ switch to a salted MessageDigest, tốt nhất là sử dụng SHA-1. Và vấn đề của bạn trở nên phức tạp hơn, vì mật mã của PHP là một trình bao bọc mà might use one of several algorithms. Nhưng hãy giả sử PHP của bạn sử dụng mã hóa UNIX gốc DES, sau đó tất cả những gì bạn cần là thực hiện điều đó trong Java. Theo tôi biết, không có triển khai mã hóa của UNIX trong bản cài đặt Java chuẩn, nhưng bạn có thể muốn look here để có danh sách các tùy chọn.

+0

404 trên liên kết đó ... – James

1

Mật mã của PHP hỗ trợ nhiều hàm băm. Nếu bạn sử dụng phiên bản MD5 (băm bắt đầu với $ 1 $), bạn có thể tìm thấy một thi Java ở đây,

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

Xin lưu ý rằng họ sử dụng lớp MD5 riêng của họ. Tôi không chắc chắn nếu nó giống như MD5 tiêu chuẩn.

Tôi chắc chắn bạn cũng có thể tìm thấy triển khai Java cho các thuật toán băm khác.

10

Đây là một chuỗi cũ nhưng tôi đã gặp sự cố tương tự và tìm thấy giải pháp khác. Bạn có thể sử dụng các lớp UnixCrypt/Md5Crypt trong thư viện Apache Commons Codec 1.7.

Ví dụ, bạn có thể gọi

UnixCrypt.crypt(string, salt) 

HOẶC

Md5Crypt.md5Crypt(byte[], salt) 

Tôi đã không nhìn vào các loại mã hóa khác nhưng tôi tưởng tượng của họ là các tiện ích khác nữa.

+0

Đây là câu trả lời đúng ... cảm ơn – James

0

tôi có thể khuyên này: MD5Crypt implementation

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

Đây là một trong số ít những triển khai, mà làm việc cho tôi.

Các vấn đề liên quan