2010-07-20 145 views
12

我將我的PHP代碼遷移到Google App Engine - Java。
所以我需要一個相當於Java的PHP的crypt函數,
因爲我已經在我的數據庫中存儲了使用crypt的註冊用戶的所有密碼
Java的PHP的crypt函數的等效

編輯1: 這裏是加密的密碼我的PHP代碼:

$密碼= 「test123」;
$ pwd = crypt($ password,$ password);
echo $ pwd;

輸出是(在的Windows以及對HostMonser一個基於Linux的服務器):
temjCCsjBECmU

能有人給我equivalted Java代碼?
我已經試過各種排列組合&與
MessageDigest類,但不能得到它的權利..

編輯2
這是我本以爲這工作,但沒有示例代碼:

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

請告訴我你沒有使用默認的(DES)crypt算法.... theres現代unixen不帶有crypt實用程序的原因 - 它之前已被破解。 – 2010-07-20 16:36:29

+0

@Billy ONeal:PHP的默認值取決於操作系統。在Linux/BSD上,它默認使用鹽醃的MD5(除了真正的舊版本)。新版本甚至可能會使用更新的方案,如鹽醃SHA512。 – Powerlord 2010-07-20 17:29:46

+0

@Billy ONeal:然而,dta * just *發佈的代碼確實是DES ...必須位於PHP 5.2或更低版本的Windows機器上。 – Powerlord 2010-07-20 17:43:30

回答

4

你必須知道什麼是執行PHP地穴已使用(MD5 SHA256 SHA512???),因爲有好幾種,根據您的操作系統:http://php.net/manual/fr/function.crypt.php

Java的等價類是MessageDigest。當你創建這個類的一個實例,您提供的哈希算法,例如:

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

這個PHP手冊頁是法文版,英文版在這裏:http://php.net/manual/en/function.crypt.php – Powerlord 2010-07-20 17:34:28

+0

對不起。感謝您的更正。由於我是法國人,所以在發佈回覆時我沒有注意到。 – 2010-07-20 18:10:40

+1

加密密鑰如何?有什麼方法可以在java中使用crypt密鑰,就像在php中一樣?例如,crypt($ password,「test」)會在php中加密不同於crypt($ password)的密碼... – 2014-07-14 12:03:08

0

那麼,據我所知,PHP的crypt實際上並不是加密的。它只是一些單向哈希函數的包裝,我相信,所以如果你當前的PHP站點使用crypt的MD5或SHA256或其他,我希望你可以在Java中找到這些等價的哈希類/函數。

1

你需要看看在java.security類(曾經被TBE的JCE):

在那裏你可以找到你需要做的一切(取決於你需要哪種算法)。

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

例如,消息摘要的MD5/SHA等:​​

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

檢查這些對這裏的谷歌應用程序引擎的白名單,我不知道什麼是支持的,哪些不是。

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

java。安全的東西可以是一個有點痛與工作有時,你可能或者想使用Jasypt - 這是一個更簡單的API與任何JCE工作:

http://www.jasypt.org/

2

看來你有工作一個遺留數據庫已經填充了您不能丟棄的密碼,所以您不能只使用switch to a salted MessageDigest,最好使用SHA-1。而且你的問題變得更加複雜,因爲PHP的crypt是一個包裝器might use one of several algorithms。但是讓我們假設你的PHP使用原始的基於DES的UNIX crypt,那麼你所需要的只是用Java實現的。據我所知,在標準Java安裝中沒有實現UNIX的crypt,但您可能需要look here以獲取選項列表。

+0

404 ... – James 2014-03-30 16:36:48

10

這是一個古老的線程,但我遇到了同樣的問題,並找到了不同的解決方案。您可以使用Apache Commons Codec 1.7庫中的UnixCrypt/Md5Crypt類。

例如,你可以調用

UnixCrypt.crypt(string, salt) 

OR

Md5Crypt.md5Crypt(byte[], salt) 

我還沒有研究其他的加密類型,但我想象他們是其他公用設施,以及。

+0

這是正確的答案...謝謝 – James 2014-03-30 16:40:36

0

我可以推薦這個:MD5Crypt implementation

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

這是爲數不多的實現方式之一,這對我的作品。