string - 德尔福: how to completely remove String from the memory

标签 string delphi memory encryption

Var
S1:String;
S2:String;
begin
   S1:='Sensitive Data';
   S2:=Crypt(S1,'encryption key');
   S1:='';
   FreeAndNil(S1);
end;

现在,当我使用“WinHex”等程序搜索进程内存时,我可以轻松找到未加密的字符串! 即使我尝试制作新表单来加密该字符串然后卸载该表单,但它仍然存在

有什么办法可以彻底删除

提前致谢

最佳答案

完成后,您需要用零覆盖该字符串。像这样:

ZeroMemory(Pointer(s), Length(s)*SizeOf(Char));

如果您担心编译器会优化掉 ZeroMemory,那么您可以使用 SecureZeroMemory。然而,Delphi 编译器不会优化 ZeroMemory,因此这有点没有意义。

如果你只是写:

s := '';

然后内存将按原样返回给内存管理器。然后,您将无法控制内存管理器何时(如果有的话)重新使用或返回内存。

显然,您需要对字符串的所有副本执行此操作,因此唯一明智的方法是不复制敏感数据。

这些都对您的问题的代码没有帮助,因为您的敏感数据是字符串文字,因此存储在可执行文件中。这种方法只能对动态数据有意义。我认为您的真实程序不会将敏感数据放入文字中。

哦,永远不要将字符串传递给 FreeAndNil。您只能将对象变量传递给 FreeAndNil,但该过程使用非类型化 var 参数,因此编译器无法避免您犯的错误。

关于string - 德尔福: how to completely remove String from the memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428232/

相关文章:

javascript - Javascript 字符串中的单转义符和双转义符(反斜杠)有什么区别?

delphi - StrUtils.SplitString 未按预期工作

xml - delphi 7 读取和处理 xml 文件的方式和组件 - 更新

c++ - C++适当覆盖new []和delete []

java - 允许缺失字符的正则表达式

string - 我可以重新定义 String#length 吗?

excel - 使用excel公式在单元格中查找确切的子字符串

delphi - SOAP:Delphi 2010 生成的 WSDL 定义中的错误错误

java - Eclipse MAT 中的正则表达式类型

c++ - Qt的两个QList成员变量导致崩溃