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 并返回。
再次感谢您的意见!
我有一个带有客户端数据集的 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 并返回。
再次感谢您的意见!