Java 可恢复哈希计算

问题描述 投票:0回答:3

我想实现对服务器上上传的某些文件进行可恢复的即时哈希生成。这些文件很大,因此我正在动态使用 MessageDigest 类的 update(byte[]) 方法(如此处所述,例如:如何生成 MD5 哈希值?),因为新字节从 HttpServletRequest 的 InputStream 到达.

一切都很顺利,但是,当我想添加断点续传支持时,它变得很有趣。如果上传提前终止,则不完整的文件将存储在磁盘上。但是,控制器(和底层服务)退出,因此 MessageDigest 对象丢失。在此之前,我可以将 MessageDigest 对象序列化到磁盘(或数据库,没关系),这样当我再次反序列化该对象时,它会记住它的临时状态,因此当我恢复上传时(从确切的位置开始)之前终止的地方,所以没有多余的字节,也没有丢失一些字节)并继续 update() 反序列化 MessageDigest,最终我得到相同的结果(哈希),就像文件一次上传整个文件一样?

java serialization hash resume
3个回答
3
投票

获取自定义 MD5 实现之一,例如 this onethis one。使其可序列化或只是将其内部状态公开。上传中止时保留状态,恢复上传时恢复状态。


1
投票

哈希值的计算成本很低(MD5 的成本加倍;您确定不需要 SHA1 吗?)。我建议您在检测到上传已恢复后立即从头开始重新进行所有操作。运行时间应该很短,除非上传确实很大——希望大的、中断的上传会很少。


0
投票

BouncyCastle MD5 实现允许通过

MD5Digest.getEncodedState()
创建内部状态的字节数组。该数据可以是持久的,并且稍后使用字节数组的构造函数从中重建对象。

来源位于https://github.com/bcgit/bc-java/blob/b8e4716f170a63986f8d3144445e3abff0e40475/core/src/main/java/org/bouncycastle/crypto/digests/MD5Digest.java#L338

© www.soinside.com 2019 - 2024. All rights reserved.