【问题标题】:ClientDatSet.LoadFromFile(DeCryptFile(XMLFile))?ClientDatSet.LoadFromFile(DeCryptFile(XMLFile))?
【发布时间】:2020-12-10 13:51:27
【问题描述】:

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

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

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

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

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

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

提前感谢我能得到的任何帮助。

【问题讨论】:

    标签: encryption tclientdataset delphi-10.4-sydney lockbox-3


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的评论。据我所知,Lockbox 确实有一个 EnCryptStream 和 DeCryptStream,但它们和 DecryptFile 一样是过程。我会考虑尝试使用 MemoryStream,看看它会把我带到哪里。再次感谢。
    • 至于替代解决方案:我发现了一个 DeleteAndWipe 示例,其中建议在删除临时文件之前使用不同的值多次覆盖它。我也试试看。
    • @lscshj 如果 LockBox 有 EncryptStream,则将 ClientDataSet 保存到 TMemoryStream 并使用 MemoryStream.SaveToFile 将加密的流保存到文件中。反过来,使用 TMemoryStream 和他的 LoadFromFile 加载文件,使用 Lockbox 解密流并使用解密的流加载 ClientDataSet。忘记 DeleteAndWipe,因为如果您的程序崩溃(可能是故意的),解码的数据将保留在那里。
    【解决方案2】:

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

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

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

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

    这段代码正在运行,给了我一个填充好的 DBGrid,其中包含根据所选 XML 文件的字段和定义以及数据。

    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 文件。

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

    再次感谢您的意见!

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2018-06-05
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多