Operating system 操作系统如何存储加密数据的密钥

Operating system 操作系统如何存储加密数据的密钥,operating-system,keychain,dpapi,key-storage,Operating System,Keychain,Dpapi,Key Storage,我想知道操作系统如何存储用于加密网站密码等内容的密钥。在网上搜索后,我只找到了两个答案,但它们只涉及服务提供商应该如何存储密码(他们应该存储哈希和salt),或者应用程序应该如何存储密码(他们应该使用提供加密的系统api) 但我想知道的是系统本身是如何保护加密密钥的。我知道有些设备有特殊的硬件来存储一些重要的密钥(比如苹果芯片中的安全飞地)。但我想知道在普通的电脑里是怎么做到的 我的意思是,他们可能会将其存储在磁盘上的某个位置,但他们如何安全地执行此操作,使您不能仅读取它?几乎所有“安全凭据存储

我想知道操作系统如何存储用于加密网站密码等内容的密钥。在网上搜索后,我只找到了两个答案,但它们只涉及服务提供商应该如何存储密码(他们应该存储哈希和salt),或者应用程序应该如何存储密码(他们应该使用提供加密的系统api)

但我想知道的是系统本身是如何保护加密密钥的。我知道有些设备有特殊的硬件来存储一些重要的密钥(比如苹果芯片中的安全飞地)。但我想知道在普通的电脑里是怎么做到的


我的意思是,他们可能会将其存储在磁盘上的某个位置,但他们如何安全地执行此操作,使您不能仅读取它?

几乎所有“安全凭据存储”都是通过使用随机密钥加密磁盘上的凭据存储文件,并使用密码短语进一步加密。如果没有密码短语,您将无法访问解密内容所需的密钥。您还可以将密钥存储在加密设备(例如NFC智能卡或USB加密狗)中,这些设备将受到自身质询系统(密码短语、指纹等)的保护

密码短语是由操作系统元素直接从用户处获取的,因此欺骗密码(例如通过网站)将更加困难,并且也使得应用程序不需要直接访问凭据存储–一旦用户解锁存储,应用程序就可以获得其最初存储的凭据,并且只获得那些凭据。有多种机制可用于此,但一种常见的机制是使用发出查询的可执行文件的应用程序id–进一步的限制是,可执行文件必须仅运行有符号的二进制元素(无库注入等),并且不受调试的影响(操作系统完全知道这一点)

至于操作系统如何防止明文材料在内存中泄漏?哈。这完全是另一回事,有多种方法—防止数据溢出到交换,使用加密交换,仅解密立即需要的凭据,并在不需要时立即丢弃凭据,包括在系统运行时由内核管理在线存储(在RAM中),并使用内核运行所有需要访问的加密操作,例如非对称密码私钥。内核可以进一步将其降级到硬件设备,而操作系统提供统一的API,无论私钥存储在哪里。这样的API存在于OSX和Windows上,当然也存在于Linux上


由于TPM或USB设备(如加密读卡器)可以安全地存储私钥,因此使用个人证书而不是密码进行身份验证非常有用。然后,带有私钥的设备可以对来自远程服务器(例如,证书支持网站)的质询进行签名,远程系统会根据您的公共证书检查质询的签名,因此不是敏感证书。旁白:我希望金融机构和日常网站支持个人证书而不是密码。它更安全,完全没有麻烦,可以跨所有平台工作,甚至是移动平台

好的,这意味着最后一个密钥(可能,取决于操作系统)是您计算机的密码,没有密码的计算机确实会将密钥以明文形式存储在磁盘上。对吗?不太对。受保护的存储总是加密的,但您的登录密码会解锁解密该存储所需的主密钥。空密码仍然是密码,它仍然“保护”存储区域的主密钥。虽然这是一个“明显的”密码,但它仍然存在。无论您是否有密码,都不会使用明文存储。使用明文是非常不负责任的,因为数据容易泄漏:如果加密的数据泄漏,那么即使你有一个空密码,该数据的随机密钥仍有望以一种不太可能泄漏的方式保留。此外,密码不是保护安全区域敏感主密钥的唯一因素:可以使用链接到指纹扫描仪的硬件加密模块,例如iOS设备中的安全Enclave。您还可以使用单独的密码进行安全存储保护:即使Windows密码为空,您仍然可以拥有安全存储的密码。OSX上的相同:钥匙链和登录密码只有在默认情况下是相同的,但您可以随时偏离默认值。