java - 哈希整个对象而不先转换为 byte[]

标签 java hash sha256

我想获取特定 java 对象的 sha2 哈希值。我不希望它是 int,我想要 byte[] 或至少是 String。我有以下代码来创建 sha2:

static byte[] sha2(byte[] message) {
    if (message == null || message.length == 0) {
        throw new IllegalArgumentException("message is null");
    }
    try {
        MessageDigest sha256 = MessageDigest.getInstance(SHA_256);
        return sha256.digest(message);
    } catch (NoSuchAlgorithmException e) {
        throw new IllegalArgumentException(e);
    }
}

我可以将我的对象转换为 byte[],但我认为将大数组存储在内存中只是为了创建 32 字节数组不是一个好主意。那么如何计算对象的 sha2(或者另一个加密哈希函数)呢?

最佳答案

您不必将整个对象加载到内存中,您可以将它的一部分加载到临时缓冲区中。

使用 FileOutputStream/BufferedOutputStream 将对象转储到临时文件中,这将确保序列化对象不会污染 JVM 内存。

使用 FileInputStream/BufferedInputStream 从临时文件加载序列化对象,并将其提供给循环中的 MessageDigest#update(buf) 方法。

最后调用MessageDigest#digest()完成工作:

int[] buf = new int[1024];
while (/* has more data */) {
    int readBytes = readIntoBuf(buf);
    sha256.update(buf, 0, readBytes);
}
return sha256.digest();

如果您有能力在内存中存储整个序列化对象,请使用 ByteArrayOutputStream 并将结果 byte[] 传递给 MessageDigest#digest(buf):

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOuputStream(baos)) {
    oos.writeObject(obj);

    MessageDigest sha256 = MessageDigest.getInstance(SHA_256);
    return sha256.digest(baos.toByteArray());
}

关于java - 哈希整个对象而不先转换为 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949740/

相关文章:

java - 从子类调用方法

java - 与逐行读取相比,将整个文件读取到单个字符串中有何优点和缺点?

c# - SHA256 使用文件的哪些部分来计算哈希值

java - java中如何删除字符串中第一次出现字符后的内容?

java.sql.SQLException : Unable to load class: com. mysql.jdbc.驱动程序

hash - 单独链接中的负载系数?

java - Apache Shiro - 密码格式问题

perl - 为什么所有这些访问数组的方法都有效?

python - Python 的 pbkdf2_sha256.verify 的 NodeJS 实现

android - 如何验证 APK 上的签名证书是否与 SHA256 指纹匹配?