Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇不工作。散列值dosen';t等于字符串。我的编码有问题吗?_Java_Hash_Java Security - Fatal编程技术网

Java 爪哇不工作。散列值dosen';t等于字符串。我的编码有问题吗?

Java 爪哇不工作。散列值dosen';t等于字符串。我的编码有问题吗?,java,hash,java-security,Java,Hash,Java Security,基本上我有这个 if (args.length != 1) { System.err.println("Usage: java MyMd5 <message>"); System.exit(1); } try { // get message byte[] message = args[0].getBytes("UTF8"); // create message digest obj

基本上我有这个

   if (args.length != 1) {
        System.err.println("Usage: java MyMd5 <message>");
        System.exit(1);
    }
    try {
        // get message
        byte[] message = args[0].getBytes("UTF8");
        // create message digest object for MD5
        MessageDigest messageDigest = MessageDigest.getInstance("SHA");
        // System.out.println("Provider: " +
        messageDigest.getProvider().getInfo();
        // create message digest
        messageDigest.update(message);
        byte[] md = messageDigest.digest();
        // print result
        System.out.println("Message Digest Algorithm: MD5");
        System.out.println("Message: " + new String(message));
        System.out.println("Message Digest: \"" + new String(md, "UTF8") + "\"");
        String HashPassword=new String(md, "UTF8");
        System.out.println(HashPassword);
        System.out.println(HashPassword.equals("???8p???W?B:??N?~"));

问题在于不必要的编码,使用md5我们必须以正确的方式编码字符串,而不是使用UTF8编码

public static void main(String[] args) throws Exception {
    String pass = "pass123";
    byte[] message = pass.getBytes();
    MessageDigest messageDigest = MessageDigest.getInstance("SHA");
    messageDigest.update(message);
    byte[] md = messageDigest.digest();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < md.length; i++) {
        sb.append(Integer.toString((md[i] & 0xff) + 0x100, 16).substring(1));
    }
    System.out.println("encoded pass:" + sb.toString());
    System.out.println(sb.toString().equals("aafdc23870ecbcd3d557b6423a8982134e17927e"));
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串pass=“pass123”;
byte[]message=pass.getBytes();
MessageDigest=MessageDigest.getInstance(“SHA”);
messageDigest.update(message);
字节[]md=messageDigest.digest();
StringBuffer sb=新的StringBuffer();
对于(int i=0;i
如果我正确理解了您的问题,您希望将新生成的哈希字符串与现有的哈希字符串(存储在数据库或其他地方)进行比较。例如,如果您将生成的值(而不是从控制台复制)存储到数据库,然后将其与新生成的值进行比较,则可以使用上面提供的代码获得
true

但当您生成散列时,它包含符号(字符),在任何字符串编码中都没有正确的表示形式。因此,没有人不将哈希存储为普通字符串。通常它们存储在
十六进制字符串
表示法或
Base64
表示法中

使用以下提供的
十六进制字符串实现:

public static void main(String[] args) throws Exception { // args = ["Hello world"]
if (args.length != 1) {
    System.err.println("Usage: java MyMd5 <message>");
    System.exit(1);
}
// get message
byte[] message = args[0].getBytes("UTF8"); //You may have problems with encoding here. In Windows, for example, with symbols that are out of English alphabet range  
// create message digest object for MD5
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
// System.out.println("Provider: " +
messageDigest.getProvider().getInfo();
// create message digest
messageDigest.update(message);
byte[] md = messageDigest.digest();
System.out.println("Digest: " + byteArrayToHexString(md));
System.out.println("Is equals? " + byteArrayToHexString(md).equals("7b502c3a1f48c8609ae212cdfb639dee39673f5e"));
}

private static String byteArrayToHexString(byte[] array) {
    StringBuilder result = new StringBuilder(array.length);
    IntStream.range(0, array.length)
        .forEach(i -> result.append(Integer.toString( (array[i] & 0xff) + 0x100, 16).substring(1)));
    return result.toString();
}
publicstaticvoidmain(字符串[]args)引发异常{//args=[“helloworld”]
如果(args.length!=1){
System.err.println(“用法:JavaMyMD5”);
系统出口(1);
}
//得到消息
byte[]message=args[0]。getBytes(“UTF8”);//此处的编码可能有问题。例如,在Windows中,使用超出英文字母范围的符号
//为MD5创建消息摘要对象
MessageDigest=MessageDigest.getInstance(“SHA”);
//System.out.println(“提供程序:”+
messageDigest.getProvider().getInfo();
//创建消息摘要
messageDigest.update(message);
字节[]md=messageDigest.digest();
System.out.println(“摘要:+bytearraythextstring(md));
System.out.println(“Is equals?”+byteArrayToHexString(md.equals)(“7B502C3a1F48C8609AE21CDFB639DEE39673F5E”);
}
私有静态字符串byteArrayToHexString(字节[]数组){
StringBuilder结果=新的StringBuilder(array.length);
IntStream.range(0,array.length)
.forEach(i->result.append(Integer.toString((数组[i]&0xff)+0x100,16).子字符串(1));
返回result.toString();
}

另外,在提供的示例中,您提到您正在使用
MD5
,但实际上它是
SHA
MessageDigest=MessageDigest.getInstance(“SHA”)主要问题是你在字节数组和字符串之间转换,在几个地方假装字节数组包含UTF-8编码的文本,而实际上它根本不是编码的文本。
表示不可打印的字符,所以
不一定等于
-在字节级别上比较“JavaMD5不工作。”:您注意到这是多么不可能的事?Java中的MD5已经存在多年了。
public static void main(String[] args) throws Exception { // args = ["Hello world"]
if (args.length != 1) {
    System.err.println("Usage: java MyMd5 <message>");
    System.exit(1);
}
// get message
byte[] message = args[0].getBytes("UTF8"); //You may have problems with encoding here. In Windows, for example, with symbols that are out of English alphabet range  
// create message digest object for MD5
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
// System.out.println("Provider: " +
messageDigest.getProvider().getInfo();
// create message digest
messageDigest.update(message);
byte[] md = messageDigest.digest();
System.out.println("Digest: " + byteArrayToHexString(md));
System.out.println("Is equals? " + byteArrayToHexString(md).equals("7b502c3a1f48c8609ae212cdfb639dee39673f5e"));
}

private static String byteArrayToHexString(byte[] array) {
    StringBuilder result = new StringBuilder(array.length);
    IntStream.range(0, array.length)
        .forEach(i -> result.append(Integer.toString( (array[i] & 0xff) + 0x100, 16).substring(1)));
    return result.toString();
}