3

PBKDF2のJava実装を取得しようとして、これをC#バージョンとして使用しました:https ://github.com/shawnmclean/SimpleCrypto.net

私のコード:

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class PBKDF2 {

    public static void main(String[] args) {
        try {
            SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            KeySpec ks = new PBEKeySpec("iamtwentycharacterss".toCharArray(),"50.eGIYr3ZpxpWw67utH17s/A==".getBytes(),50,64);
            SecretKey s = f.generateSecret(ks);
            Key k = new SecretKeySpec(s.getEncoded(),"HmacSHA1");
            System.out.println(new String(k.getEncoded()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }       
    }

}

私はstackoverflowでさまざまな答えを試しました:

Coldfusion 9とJava(Android)で異なる結果を生成する暗号化/復号化用のJava SimpleCrypto Class

Java-PRFとしてHMACSHA256を使用したPBKDF2

JavaでのPBKDF2によるパスワード検証

残念ながら、結果は一致しません。結果は次のようになります。 mOs/Mw7ZRM99i/BTJ+xnmj5Pm6QlqP1vuPqrf/Qa3WwassxI1QJ447OqdoBzunbJjvrx7+bHAO1Dnj8ltS4TKA==

4

2 に答える 2

2

次のコードが役立つ場合は、Rfc2898DeriveBytesクラスで問題を解決しました:http://pastebin.com/iReZJ3Vq

import java.nio.charset.Charset;

import org.bouncycastle.util.encoders.Base64;

public class PBKDF2 {

    public static void main(String[] args) {
        try {
            String password = "iamtwentycharacterss";
            String salt = "50.eGIYr3ZpxpWw67utH17s/A==";
            int iterations = Integer.parseInt(salt.substring(0, salt.indexOf('.')));
            byte[] saltBytes = salt.getBytes(Charset.forName("UTF-8"));

            Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, saltBytes, iterations);
            byte[] key = rfc2898.getBytes(64);
            String hash = new String(Base64.encode(key));
            System.out.println(hash);
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex);
        }
    }

}
于 2012-07-24T14:48:11.143 に答える
0

どうしてこの点を逃したのか……。

プログラムで必要なキーの長さは64ですが、期待する結果のキーの長さは512です。pbekeyspecの目的のキーの長さを512に変更してください。

KeySpec ks = new PBEKeySpec("iamtwentycharacterss".toCharArray(),"50.eGIYr3ZpxpWw67utH17s/A==".getBytes(),50,512);
于 2012-07-24T15:01:12.763 に答える