sar*_*old 30
在我所知道的任何平台上都没有加密内存.无论如何,它将是有限的价值,因为处理器通常必须对明文数据进行操作,因此数据必须在机器的某个地方以明文形式存在.
相反,现代操作系统(以及大多数历史操作系统)使用内存保护来仅允许某些进程访问某些内存页面.每个内存页面都带有读取,写入和(有时)执行权限.操作系统内核负责在上下文切换上处理这些权限,以根据需要授予或拒绝对每个进程的内存页面的访问.
Saltzer和Schroeder在1975年的论文"计算机系统中的信息保护"中描述了一种使用段而不是页面的机制,但该原理几十年来一直保持不变.
通常,任何进程拥有的内存页面都可由具有足够高权限的进程读取 ; 操作系统内核当然可以修改任何内存页面,它也可以选择将该权限委托给用户进程.在ptrace(2)
在Linux系统调用提供了一种调试程序,后门可被用来实现只读存储器检查系统,例如strace(1)
或ltrace(1)
或gdb(1)
或存储器-修饰系统如gdb(1)
和ptrace
基于沙箱环境.
或者,在某些情况下(参见和联机帮助页),可以转储核心文件,其中包含进程内存的内容.这就是为什么在发布之前清除重要数据的记忆很重要的一个原因.core(5)
setrlimit(2)
我是一个在运行程序中加密指针(非PTO链接)的团队的一员.开销很惊人,角落案件的数量更加令人惊讶.将这些技术用于通用程序可能并不实用,尽管我可以想象加密内存或控制结构是一种可行方法的受限环境.(虽然其他技术可能更合适.)
lit*_*adv 12
好吧,所以我想将一些数据存储在变量中(我知道,变量存储在内存中) - 内存中的数据是否加密?
没有
此外,软件是否有可能读取存储在内存中的变量名称并能够实际从中提取数据?
名称或值?
对于价值观:
你的意思是一个不同的程序,而不是你的程序,访问它并阅读它?是的,这可能,取决于操作系统,它可能是棘手或棘手的,但可行.
对于名称:取决于您如何构建软件 - 如果您将调试信息留在其中 - 这很容易做到.
不.内存通常不加密.
内存存储您写入的数据.在某些时候,内存将包含数据的纯文本版本,这有时被用作利用系统的方式.
也就是说,一旦攻击者可以物理访问您的计算机,就很难保护它们.
有一些语言特定的功能试图解决这个问题,例如C#SecureString ,但即便如此也有其局限性.
内存中的数据是否加密?
通常没有.我说"通常"只是因为你可以想象一个操作系统或硬件加密内存.真的,不.
软件是否有可能读取存储在内存中的变量名称并能够实际从中提取数据?
要看.使用PHP等解释语言中的代码,变量名称会保存在某个内存中,因此可以想象它是可能的.使用像C++这样的编译代码,它可以使用调试信息进行编译(然后调试器将能够查看变量名称并提取它们的值),或者可以在没有它的情况下进行编译,然后变量名称丢失.
此外,编写一个读取任意内存地址的程序非常容易,但要弄清楚读取的字节数是多么困难.