2012-02-09 10 views
1

私はjoomlaベースのCMSシステムからスプリングベースのJava EE環境にいくつかのデータを移行しています。塩をコード化したMd5

分析中、私はパスワードのmd5実装がjoomlaと同じではないことを発見しましたか?任意のアイデアなぜmd5実装の違い??例えば

: joomlaのレコードは「3c57ebfec712312f30c3fd1981979f58:WnvTroeiBmd5bjGmmsVUnNjppadH7giK」のようなパスワードフィールドを持っていた場合(ここでは3c57ebfec712312f30c3fd1981979f58最終md5ハッシュダイジェストであるとWnvTroeiBmd5bjGmmsVUnNjppadH7giKは、ユーザーパスワードの入力を付加するための鍵である)と、ユーザがこのレコードでログインしようとしたときそれは失敗する。

スプリングベースのJava EEシステムでは、ハッシュエンコーダをmd5として使用し、saltはいくつかの変数としてWnvTroeiBmd5bjGmmsVUnNjppadH7giKここで使用します。

Junitコードスニペット:このテストケースは失敗します。

@Test 
public void testSpringMD5Functionality() { 

    String md5MigratedPassword = "3c57ebfec712312f30c3fd1981979f58:WnvTroeiBmd5bjGmmsVUnNjppadH7giK"; 
    String[] m = md5MigratedPassword.split(":"); 

    Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder(); 
    passwordEncoder.setEncodeHashAsBase64(false); 
    boolean value = passwordEncoder.isPasswordValid(m[0], "password", m[1]); 
    assertTrue(value); //test case fails ????? 

} 

答えて

0

SpringのMd5PasswordEncoderはJoomlaのの塩漬けMD5パスワードと互換性があることを主張することはありません。

要するに、動作しません。あなたはJoomlaのものと同じことをするJavaコードが必要です。

http://forum.joomla.org/viewtopic.php?t=207689#p993378がこのようなコードであると主張する場合は、試してみる必要があります。

類似の原因がエンコードの問題である可能性が高い場合は、Java文字列(16ビット幅の文字)をPHP互換のバイト表現に変換する必要があります。

また、PBKDF2などのより強力なパスワード導出関数への移行パスを検討する必要があります。

+0

それはthis.Belowテストケースを修正するために、ほとんどの日は@Test 公共ボイドtestSpringMD5Functionality(){ 文字列md5MigratedPassword = "3c57ebfec712312f30c3fd1981979f58:WnvTroeiBmd5bjGmmsVUnNjppadH7giKを" 作品連れて行ってくれました。 String [] m = md5MigratedPassword.split( ":"); Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder(); passwordEncoder.setEncodeHashAsBase64(false); ブール値= passwordEncoder.isPasswordValid(m [0] + m [1]、 "password"、null); assertTrue(値); //テストケースを渡す } – challenge

2

上記は機能しません(チャレンジによるコメントを含む)。以下のコードはhttp://forum.joomla.org/viewtopic.php?t=207689#p993378から取得され、塩漬けパスワードと非塩漬けパスワードの両方で動作することが確認されています。

public class Joomla15PasswordHash 
{ 
    public static boolean check(String passwd,String dbEntry) { 
     if (passwd==null || dbEntry==null || dbEntry.length()==0) 
    throw new IllegalArgumentException(); 
     String[] arr = dbEntry.split(":",2); 
     if (arr.length==2) { 
    // new format as {HASH}:{SALT} 
    String cryptpass = arr[0]; 
    String salt = arr[1]; 

    return md5(passwd+salt).equals(cryptpass); 
     } else { 
     // old format as {HASH} just like PHPbb and many other apps 
    String cryptpass = dbEntry; 

    return md5(passwd).equals(cryptpass); 
     } 
    } 

    static Random _rnd; 

    public static String create(String passwd) { 
     StringBuffer saltBuf = new StringBuffer(); 
     synchronized (Joomla15PasswordHash.class) { 
    if (_rnd==null) _rnd=new SecureRandom(); 
    int i; 
    for (i=0;i<32;i++) { 
     saltBuf.append(Integer.toString(_rnd.nextInt(36),36)); 
    } 
     } 
     String salt = saltBuf.toString(); 

     return md5(passwd+salt)+":"+salt; 
    } 

    /** Takes the MD5 hash of a sequence of ASCII or LATIN1 characters, 
    * and returns it as a 32-character lowercase hex string. 
    * 
    * Equivalent to MySQL's MD5() function 
    * and to perl's Digest::MD5::md5_hex(), 
    * and to PHP's md5(). 
    * 
    * Does no error-checking of the input, but only uses the low 8 bits 
    * from each input character. 
    */ 
    private static String md5(String data) { 
     byte[] bdata = new byte[data.length()]; int i; byte[] hash; 

     for (i=0;i<data.length();i++) bdata[i]=(byte)(data.charAt(i)&0xff); 

     try { 
     MessageDigest md5er = MessageDigest.getInstance("MD5"); 
     hash = md5er.digest(bdata); 
     } catch (GeneralSecurityException e) { throw new RuntimeException(e); } 

     StringBuffer r = new StringBuffer(32); 
     for (i=0;i<hash.length;i++) { 
     String x = Integer.toHexString(hash[i]&0xff); 
     if (x.length()<2) r.append("0"); 
     r.append(x); 
     } 
     return r.toString();  
    } 
} 
関連する問題