-3

在我的应用程序中,我读取一个文件,计算其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。我的问题是,当我在注释中写入任何值时,文件的哈希值会发生变化,并且我正在编写基于文件哈希值的字符串。

我想我会在计算哈希之前擦除“评论”属性。

4

1 回答 1

0

你的前提是错误的。您输入的“评论”数据存储在 .JPG 文件的 EXIF 部分的文件中。它没有固定的偏移量,因此很难将其从哈希中排除。您需要解析 .JPG 文件并手动跳过您不想包含在哈希中的文件部分。阅读 .JPG 文件和其中存储的 EXIF 信息。

或者重新考虑你的前提。如果您只是想对图像部分进行哈希处理,您可以将图像加载为 TBitMap 并迭代图像中的所有像素(一个非常缓慢的过程)并将它们的颜色代码包含在您的哈希中,从而排除任何数据t 图像本身的实际部分。

这两种方法都意味着除了您知道文件格式的文件之外,您无法对任何其他内容执行您正在尝试的操作(除非它们都是您可以加载到 TBitmap 中的图像文件,因此仅在哈希中包含像素)。例如,您不能允许人们更改 f.ex 中的评论或其他内容。Word 文档或 PDF 文档,除非您再次手动阅读文件,并且只计算您不想让人们更改的部分的哈希值。

于 2013-09-09T15:17:19.467 回答