如何在Java中使用SHA384生成一个48个字符的哈希值

3
我正在尝试使用SHA384在Java中生成一个48个字符的哈希字符串,输出应该类似于以下内容:

PÊ&¿ a»@óæS0iÛ6në0Ê`o€X·„\KÃò¢ï¼fÖ…)nE@ó^s

我的当前实现如下:
public static String getHash(byte[] inputBytes, String algorithm) throws Exception{
    String hashValue = "";
    try {
        MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
        messageDigest.update(inputBytes);
        byte[] digestedBytes = messageDigest.digest();
        hashValue = 
        DatatypeConverter.printHexBinary(digestedBytes).toLowerCase();
    } catch(Exception e) {
        e.printStackTrace();
    }
    return hashValue;
}

public static void main(String[] args) throws Exception {
    System.out.println(getHash("The quick brown fox Jumps over the lazy dog".getBytes(), "SHA-384"));
}

输出:

b94a2179d90daf662f2ae8e41f92c2831eb0eea5a352f81ac7b0a80a07b2c357d88d0e3fc12bf4f0d888335508b09c41

从观察来看,输出的字符串长度为96个字符而不是48个字符,我做错了什么?


1
可能是因为您将 digestedBytes 转换为十六进制。请注意,digestedBytes.length 等于 48(我已测试)。但是您的“final”字符串有 64 个字节(但在 UTF-8 中只有 42 个字符)... 因此存在一些不匹配,要么您的最终字符串是错误的,要么您实际上想要 64 字节的哈希值。 - k_ssb
使用UUID生成器。 - Sumesh TG
感谢 @SumeshTG,我也检查了长度,显示为48,请问你们两位能否提供一些代码示例帮助解决问题? - Thulani Tembo
@pkpnd 请参考我的最后一条评论。 - Thulani Tembo
@pkpnd 当我尝试将字节打印到控制台时,它会输出字符串"[B@6659c656"。除了十六进制之外,是否有其他建议的类型可以用来获取实际的48个字符字符串? - Thulani Tembo
@ThulaniTembo 你应该如何将字节转换为字符?如果使用UTF-8编码,许多字节对应的是不可打印的字符。 - k_ssb
2个回答

1
你可以尝试像这样的代码:
import java.security.MessageDigest;
public class Main {
    public static String getHash(byte[] inputBytes, String algorithm) throws Exception{
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
            messageDigest.update(inputBytes);
            byte[] digestedBytes = messageDigest.digest();
            return new String(digestedBytes, "UTF-8");
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(getHash("The quick brown fox Jumps over the lazy dog".getBytes(), "SHA-384"));
    }
}

这将使用UTF-8编码将您的48字节数组转换为字符串。但是,并非所有字节都表示可打印字符,因此您最终得到的字符串字符数会稍微减少。

太神奇了!就像你说的那样,它可以将一些字节分块,除非使用ASCII字符集,否则会带来所有48个字符...非常感谢你,你真的救了我的工作!哈哈哈 - Thulani Tembo

0
package com.journaldev.examples;

import java.util.UUID;
/**
 * Java UUID randomUUID Example
 *
 */
public class UUIDExample {

    public static void main(String[] args) {
        //initialize uuid
        UUID uuid = UUID.randomUUID();
        System.out.println(uuid);

    }

}

尝试使用以下代码生成随机ID:


谢谢,但我认为我的问题可能已经很清楚了。我想要做的是获取某个字符串,然后使用SHA384进行哈希操作。在给我的规格说明中,我需要生成一个48字符哈希字符串。我已经尝试了上面的方法,但最终得到了一个96字符的哈希值。请问如何将其限制至少为48个字符输出! - Thulani Tembo
抱歉,我误解了。请搜索一下加密和解密的相关内容。 - Sumesh TG
感谢您的时间。 - Thulani Tembo
请参考以下链接,了解Java中的URL加密:https://dev59.com/iEXRa4cB1Zd3GeqPqUd9 - Sumesh TG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接