2017-09-26 21 views
0

PBKDF2WithHmacSHA256アルゴリズムがJavaで生成するのと同じハッシュをPHPで生成する必要があります。Javaから "PBKDF2WithHmacSHA256"のPHP代替語

私はいくつかの研究を行なったし、PBKDF2HMACに接続しているように見える二つの機能が見つかりました:

私は何PHPの関数を使用する必要がありますか?ネイティブのPHP関数でも可能ですか?

編集#1

私のJavaコード、私が必要と同じ結果がPHP

public static byte[] derivateKey(char[] password, byte[] salt, int iterations, int keyLengthBits) { 
     try { 
      SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); 
      PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLengthBits); 
      SecretKey key = skf.generateSecret(spec); 
      byte[] res = key.getEncoded(); 
      return res; 

     } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { 
      throw new IllegalStateException("Could not create hash", e); 
     } 
    } 
+0

私は 'hash_hmac( 'sha256'、$ data、$ key)'はあなたが望むものだと思っていますが、私は肯定的ではありません - 試してみてください。 –

+0

最初に、この関数の第1引数として 'sha256'を指定してください。 –

+1

Java関数から入力と出力のペアを投稿してください。 – user151841

答えて

1

を達成し、あなたが提供してきたJavaコードは基本的にhash_pbkdf2()です。あなたは正しいのparams渡す必要があります:明らかに

function derivateKey($password, $salt, $iterations, $keyLengthBits) 
{ 
    return hash_pbkdf2(
     'sha256', 
     $password, 
     $salt, 
     $iterations, 
     $keyLengthBits/8, 
     true 
    ); 
} 

、PHPのhash_pbkdf2()は、パラメータとしてハッシュアルゴリズムを受け付けますが、しかし、潜在的にトリッキーな違いはこれらです:

  • それはRFC 2898内に準拠していません。 の後に 16進エンコーディングが適用されているため、最後のパラメータはtrueに設定して仕様と一致させる必要があります。
  • 出力の長さをビットではなくバイトで受け付けます(したがって、なぜ8で除算するのか)。

サンプルコードではkey.getEncoded()は何ですか...どこにも指定されているエンコードアルゴリズムはありません。
RAWであることを示唆しているドキュメントがいくつか見つかりました。そのため、私が提供している例はそれに合っているはずです。そうでない場合は、自分でエンコードする必要があります。