2017-04-21 11 views
3

パスワードを使用してデータベースをハッシュしました。次のPythonコード:"PBKDF2WithHmacSHA512"からのjavaハッシュはPythonのCRYPTとは異なります(digest_alg = 'pbkdf2(1000,20、sha512)'、salt = True)(パスワード)[0])

result = str(CRYPT(digest_alg='pbkdf2(1000,20,sha512)', salt=True)(password)[0]) 

(詳細はhere見つけることができます)

パスワード=は '123' は

pbkdf2(1000,20,sha512)$b3c56f341284f4be$54297564f7a3be8c6e9c10b27821f8105e0a8120 

を生成し、私はJavaを使用してパスワードを検証する必要があります。私が間違っているの何助けてください

80385948513c8d1826a3a5b8abc303870d41d794 
54297564f7a3be8c6e9c10b27821f8105e0a8120 

:私は、次のコードを使用し

validatePassword("123", "pbkdf2(1000,20,sha512)$b3c56f341284f4be$54297564f7a3be8c6e9c10b27821f8105e0a8120"); 



    private static boolean validatePassword(String originalPassword, String storedPassword) throws NoSuchAlgorithmException, InvalidKeySpecException 
    { 
     String[] parts = storedPassword.split("\\$"); 
     byte[] salt = fromHex(parts[1]); 
     byte[] hash = fromHex(parts[2]); 

     PBEKeySpec spec = new PBEKeySpec(originalPassword.toCharArray(), salt, 1000, hash.length * 8); 
     SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); 
     byte[] testHash = skf.generateSecret(spec).getEncoded(); 

     System.out.println(toHex(testHash)); 
     System.out.println(toHex(hash)); 

     return true; 
    } 


    private static byte[] fromHex(String hex) throws NoSuchAlgorithmException 
    { 
     byte[] bytes = new byte[hex.length()/2]; 
     for(int i = 0; i<bytes.length ;i++) 
     { 
      bytes[i] = (byte)Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16); 
     } 
     return bytes; 
    } 

    private static String toHex(byte[] array) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for(int i=0; i< array.length ;i++) 
     { 
      sb.append(Integer.toString((array[i] & 0xff) + 0x100, 16).substring(1)); 
     } 
     return sb.toString(); 
    } 

をが、結果は以下の通りですか?

+0

「CRYPT」が何であるかを知らなくても誰もこの質問に答えることはできません。 –

+0

class gluon.validators.CRYPT(key = None、digest_alg = 'pbkdf2(1000、20、sha512)'、min_length = 0、error_message = 'あまりにも短い'、salt = True、max_length = 1024) – krtl

+0

http://web2py.readthedocs.io/ja/latest/validators.html – krtl

答えて

2

web2pyのコードには「バグ」があります。

ハッシュは16進文字列のように見えますが、16進文字列の文字表現としてhashlib.pbkdf2_hmac(opensslのメソッドへのプロキシ)に送られます。あなたはまた

byte[] salt = fromHex(parts[1]); 

しかし

byte[] salt = parts[1].getBytes("utf-8"); 

を使うべきではありません意味、あなたはPBEKeySpecのコンストラクタにKEYLENGTHの代わりに、塩の長さを渡す必要があります。

修正部分は読んでください:

byte[] salt = parts[1].getBytes("utf-8"); 
byte[] hash = fromHex(parts[2]); 
PBEKeySpec spec = new PBEKeySpec(originalPassword.toCharArray(), salt, 1000, 20*8); 

はそれを交換して、コードが動作します。

+0

ありがとうございました!それは実際に動作します!私はJavaに慣れていないので、このバグをお詫び申し上げます。 – krtl

+0

言い訳は必要ありません@krtl - バグはありませんでした.Web2pyのPythonコードのように見えます;) – fjalvingh

+0

はい、私はすでにそれを少ししか理解していませんでした。とにかく、あなたは素晴らしいです!ありがとうございました! – krtl

関連する問題