在我的应用程序中,我读取一个文件,计算其 MD5 哈希,用 AES128 加密,并将其写入文件注释。
多数民众赞成因为我需要确保不操纵文件。
可悲的是,当我在文件的“评论”属性中写一些内容时, MD5 会发生变化,而我的工作变得毫无用处。
所以,我想读取我的文件,不包括文件的属性,然后才计算我的HASH。 现在我用这个函数读取我的文件:
function MD5File(const FileName: string): string;
var
IdMD5: TIdHashMessageDigest5;
FS: TFileStream;
begin
IdMD5 := TIdHashMessageDigest5.Create;
FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
Result := IdMD5.HashStreamAsHex(FS)
finally
FS.Free;
IdMD5.Free;
end;
end;
如何获得“文件属性”大小?我想它们在页眉或页脚上,所以如果我知道大小我可以排除文件的第一部分或最后部分
编辑: 更多信息:我存储手动编辑文件属性的信息(右键单击 - >属性) 我也认为编辑这些信息不能改变我的MD5 ..但它确实出于某种原因! 我读了文件并用我帖子中的函数计算了它的MD5。 我的问题是,当我在注释中写入任何值时,文件的哈希值会发生变化,并且我正在根据文件哈希编写一个字符串。
我想我会在计算哈希之前擦除“评论”属性。
答案 0 :(得分:0)
你的前提是错的。您输入的“注释”数据存储在.JPG文件的EXIF部分的文件中。它没有固定的偏移量,因此从哈希中排除它并不容易。您需要解析.JPG文件并手动跳过您不希望包含在哈希中的文件部分。阅读.JPG文件和存储在其中的EXIF信息。
或重新考虑你的前提。如果您只想在图像部分上使用哈希,则可以将图像作为TBitMap加载并迭代图像中的所有像素(一个非常慢的过程)并将其颜色代码包含在哈希中,从而排除任何数据。 t图像本身的实际部分。
这两种方法都意味着你不能在除了你知道文件格式的文件之外的任何事情上做你正在尝试的事情(除非它们都是你可以加载到TBitmap的图像文件,因此只包括像素在你的哈希)。例如,您不能允许人们在f.ex中更改注释或其他内容。 Word文档或PDF文档,除非 - 再次 - 您手动读取文件并仅计算您不希望人们改变的部分的哈希值。