我想将一些数据存储在一个变量中(我知道变量存储在内存中)。内存中的数据是否加密?此外,软件是否有可能读取存储在内存中的变量名称并能够从中实际提取数据?
答案 0 :(得分:30)
在我所知道的任何平台上,
无论如何,它的价值有限,因为处理器通常必须对明文数据进行操作,因此数据必须是机器上的明文某处。相反,现代操作系统(以及大多数历史操作系统)使用memory protection仅允许某些进程访问某些内存页面。每个内存页面都带有读取,写入和(有时)执行权限。操作系统内核负责在context switch上处理这些权限,以根据需要授予或拒绝对每个进程的内存页面的访问权。
Saltzer and Schroeder's 1975 paper The Protection of Information in Computer Systems使用segments描述了一种机制,而不是页面,但原则几十年来一直保持不变。
通常,任何进程拥有的内存页面都由具有足够高权限的进程可读;操作系统内核当然可以修改任何内存页面,它也可以选择将该权限委托给用户进程。 Linux上的ptrace(2)
系统调用提供了一个调试器后门,可用于实现只读内存检查系统,如strace(1)
或ltrace(1)
或gdb(1)
,或内存 - 修改系统,例如gdb(1)
和ptrace
-based sandbox environments。
或者,在某些情况下(请参阅core(5)
和setrlimit(2)
联机帮助页),可以转储核心文件,其中包含进程内存的内容。这是clear memory of important data before release重要的一个原因。
我是一个在encrypting pointers(non-PTO link)中运行程序的团队的成员。开销很惊人,角落案件的数量更加令人惊讶。将这些技术用于通用程序可能并不实用,尽管我可以想象加密内存或控制结构是一种可行方法的受限环境。 (虽然其他技术可能更合适。)
答案 1 :(得分:12)
好的,所以我想存储一些数据 变量(我知道变量 存储在内存中) - 做那些数据 在内存中加密?
否强>
此外,软件是否可能 能够读取变量名称 存储在内存中并且能够 实际上从中提取数据?
名称或值?
对于值:
你的意思是一个不同的程序,而不是你的程序,访问它并阅读它?是的,这可能,取决于操作系统,它可能是棘手或棘手的,但可行。
对于姓名: 取决于你如何构建软件 - 如果你在其中留下调试信息 - 这很容易做到。
答案 2 :(得分:5)
没有。内存通常不加密。
内存存储您写入的数据。在某些时候,内存将包含数据的纯文本版本,这有时被用作利用系统的方式。
也就是说,一旦攻击者可以物理访问您的计算机,就很难保护它们。
有一些特定于语言的功能试图解决此问题,例如C#SecureString ,但即使这些也有其局限性。
答案 3 :(得分:5)
内存中的数据是否加密?
通常没有。我说“通常”只是因为你可以想象一个操作系统或硬件加密内存。真的,没有。
软件是否有可能读取存储在内存中的变量名并能够从中实际提取数据?
取决于。使用PHP等解释语言中的代码,变量名称会保存在某个内存中,因此可以想象它是可能的。使用像C ++这样的已编译代码,可以使用调试信息进行编译(然后调试器将能够查看变量名称并提取其值),或者可以在没有它的情况下进行编译,然后丢失变量名称。 / p>
此外,编写一个读取任意内存地址的程序非常容易,但要弄清楚你读取的字节数是多么困难。
答案 4 :(得分:0)
如果您对加密内存感兴趣,可以参考以下几个项目。
麻省理工学院AEGIS处理器
SecureCore架构
SecureME架构
Air Force基于FPGA的HAVEN系统
防篡改,加密协处理器可能会用于其中一些。它们不是一般目的。
另一种流行的方法是将整个平台,操作系统和所有内容放在托管或类型安全的代码中。这允许类型系统为您执行大部分内存保护。示例包括Scheme48,SPIN,JX和Verve操作系统和软件。
答案 5 :(得分:0)
有新的解决方案可以加密标准x86微处理器上的内存,免受物理攻击(冷启动攻击,有人带走包含持久数据的非易失性双列直插内存模块(NVDIMM),插入恶意I / O卡直接内存访问(DMA)攻击等)。
一种方法是使用在CPU末级缓存(L3缓存)中运行的高保障管理程序。 CPU内部是明文,CPU外部是加密内存。
请注意,您仍然需要保护特权用户并修补您的应用程序(您已经完成的所有工作),但新技术确实可以保护使用中的数据免受物理攻击。