SecretFactory.generateSecret:将byte []转换为char []

问题描述

我已经尝试了2天,以解决一个简单的问题。 我有一个简单的Python脚本来加密密码。我想用Java重新编程。

如果我将最多127个字节作为密码传递,则两个脚本的结果相同。但是,如果输入128,则Java输出不匹配。 Python中的函数需要一个字节数组作为密码,而Java则需要一个char数组。

Python:

import sys
import hashlib
import time

if __name__ == "__main__":
    password = bytearray([127])
    salt = bytearray([1])
    iter = 1;
    hash = hashlib.pbkdf2_hmac("sha256",password,salt,iter)
    print(f"hash: {hash.hex()}")
    # Output:
    # password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922
    # password = [128]: 4a5fc7df8ca880cd30aeddd03180ba42c86198db706d020e41ecf6472e59e02f

Java:

import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;

public class HelloWorld {

    public static String byteArrayToHex(byte[] a) {
         StringBuilder sb = new StringBuilder();
         for (byte b : a)
            sb.append(String.format("%02x",b & 0xff));
        return sb.toString();
    }  

    public static void main(String []args) throws Exception{
     
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        char[] password = new char[]{(char) 127};
        byte[] salt = new byte[]{1};
        int iter = 1;
        int outputKeyLength = 256;
          
        KeySpec keySpec = new PBEKeySpec(password,iter,outputKeyLength);
        SecretKey hash = secretKeyFactory.generateSecret(keySpec);
        System.out.println("hash = " + byteArrayToHex(hash.getEncoded()));
        // Output:
        // password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922 **match**
        // password = [128]: 021d30f53b77d8b32a05d731f18e34e32385fd495fdc2e95ed73b7ab12b2bda9 **wrong**
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...