ClientDatSet.LoadFromFile(解密文件(XML文件))?

ClientDatSet.LoadFromFile(DeCryptFile(XMLFile))?

我有一个带有客户端数据集的 Delphi 10.4 程序,加载用户使用 OpenFile 对话框选择的 XML 文件。它工作得很好,并且根据 XML 的内容,自动设置 fielddef 结构。

现在我希望能够读取解密文件并使用 ClientDataSet.SaveToFile 保存加密文件。

目前我正在使用 Lockbox 3.7 解密所选文件,创建一个临时文件,然后由 loadfromfile 读取。同样,Savetofile 将数据写回一个临时文件,然后对其进行加密并为其指定名称。它工作得很好,但将临时文件留在磁盘上。即使我删除了代码中的临时文件,恢复它也相对容易,如果你知道怎么做的话。所以这样加密的安全性,毕竟不是那么高。

我希望能够按照主题的建议直接在 LoadFromFile 中执行解密(以及在 SaveToFile 中进行类似的加密)作为 fileEn(或 De)Crypt 函数,而不使用临时文件,但是我没有找不到任何有用的功能。

有人知道这样的功能吗?如果是这样,请指出正确的方向。最近几天我一直在使用 google 搜索有用的东西,但它让我比以前更加困惑和迷茫。

另一种解决方案是将 LockBox EnCryptFile(和 DeCryptFile)创建的临时文件完全销毁,达到无法恢复的程度,这将作为临时解决方案,因此指向完全销毁文件的方法, 也欢迎。

在此先感谢您提供的任何帮助。

使用 ClientDataSet.LoadFromStream 而不是 LoadFromFile。我确定 LockBox 具有解密为 TStream 的功能。使用 TMemoryStream 避免将解密数据存储到磁盘。

同样,将客户端数据集写入流 (SaveToStream),使用 TMemoryStream,它将保留在内存中。然后将其加密并将结果保存到磁盘。

piette:感谢您的意见。我接受了你的回答。

经过一段时间的折腾,我想出了以下解决方案。请不要评论缺少错误检查(try-Except)或内务处理(try-Final),因为它只是一个测试。在最终代码中,所有检查都将到位,并在遇到错误时通知用户。我也会改成一个函数,返回true或false,看成功与否。

还有几句话要澄清:在表格上,我有 Lockbox 3.7 的 TCryptographicLibrary 和 TCodec。 Codec ChainMode 和 Cipher 在 select 加载文件之前已经由用户选择,并且用户还提供了用作密钥的密码。该文件是使用 OpenDialog select 编辑的。窗体上还有一个 TClientDataSet、一个 TDataSource、一个 TDBGrid 和一个 TDBNavigator。

我在 ClientDataSet.LoadFromStream 时弄乱了一段时间,得到“缺少数据提供程序或数据包”,结果证明是流中缺少 Seek。因此这一行: XMLSt.Seek(0, soBeginning);就在加载流之前。

此代码有效,根据 XML 文件 selected.

Procedure TForm1.LoadFile(FileName : String; PassWord : string);
var XMLSt : TMemoryStream;
    DecSt : TMemoryStream;
begin
  DecSt := TMemoryStream.Create;
  DecSt.LoadFromFile(FileName);

  XMLSt := TMemoryStream.Create;

  Codec1.Password    := PassWord;
  Codec1.DeCryptStream(XMLSt,DecSt);

  XMLSt.Seek(0, soBeginning);
  ClientDataSet1.LoadFromStream(XMLSt);

  XmlSt.Free;
  DecSt.Free;

  ClientDataSet1.Active  := true;
end;

相反,使用 ClientDataSet.SaveToStream、Codec1.EnCryptStream 和 TMemoryStream.SaveToStream 将 ClientDataSet 内容保存为加密的 XML 文件。

注意!此测试使用表单,允许用户 select 解密的 XML 文件,编辑内容并(一旦相应的 SaveFile 就位),能够再次将内容保存为加密的 XML 文件。删除可视化组件并在运行时创建它们相对容易,允许这是一个通用功能,将加密数据从 XML 文件传输到 ClientDataSet 并返回。

再次感谢您的意见!