假设我只想在程序启动时输入一次主密码,那么通常如何在内存中保护这个主密码?从密码导出后的加密密钥是否再次加密?如果是,凭什么?它是分多部分存放,在使用前才拼凑起来的吗?
这种事情一般是怎么做的?甚至值得努力吗?
假设我只想在程序启动时输入一次主密码,那么通常如何在内存中保护这个主密码?从密码导出后的加密密钥是否再次加密?如果是,凭什么?它是分多部分存放,在使用前才拼凑起来的吗?
这种事情一般是怎么做的?甚至值得努力吗?
我认为在内存中拥有敏感数据(无论是密码还是派生密钥等)并不是大多数系统处理的事情。
话虽如此,这里有几种可能的缓解方法来保护内存中的私有数据。这可能适用于各种主题、服务器、移动或桌面。校长是一样的。我也不确定您最感兴趣的攻击媒介。(病毒,物理攻击)
显而易见的第一步是禁用交换,这是一项占用较少使用的内存“页面”并将它们写入硬盘空间的功能。它会是碎片化的,但攻击者很有可能使用这种方法获取数据。
某些操作系统可能提供了一种存储特殊标记的内存的方法,这些内存禁止存储在交换中。不过我从来没有研究过它,而且我确信它比典型的运行时变量更复杂。如果您这样做,您将不再需要在整台机器上禁用交换以影响相关的性能。
@Stephane 评论说 Windows 有一个名为 CryptProtectMemory 的选项来加密内存。我认为这很聪明,因为这样就必须禁止交换密钥,而不是每条敏感信息。
至于内存本身(无论是否交换),如果您以 root 身份或以运行该进程的同一用户帐户登录,则可以转储该给定进程的所有内存。许多高级编程语言在内部以相同的用户帐户条件提供此功能。
最后一种可能是与主操作系统分离的特殊硬件模块(用于存储数据或数据的加密密钥)。我建议简要了解一下可信执行环境 (TEE) 和/或安全元件 (SE)。请参阅Android 密钥库系统。
还有一种更极端的方法是使用完全独立的(小型)计算机,即树莓派。
具体到您的主密码示例,您当然可以不存储整个主密码,而只能存储从商店中提取的最终密码。这样,用户在访问新站点时必须重新输入主密码。