点击蓝字 关注我们
1
平台
DPAPI是Microsoft开发的,专用于Windows操作系统的一个API。它允许应用程序和服务安全地存储和检索加密的数据,如密码、密钥和其他敏感信息。
2
功能
加密和解密:DPAPI可以用来加密数据,如密码和个人证书的私钥,这些数据只能由同一个用户或系统账户访问。
保护机制:使用用户的登录凭据或机器密钥来加密数据,保证数据的安全性。
透明性:对开发者友好,简化了加密过程,开发者不需要直接处理加密算法。
密钥管理:自动管理加密密钥,减少密钥丢失或滥用的风险。
3
举例
当用户在 Windows 操作系统上使用 Google Chrome 浏览器并选择让浏览器保存密码时,Chrome 会利用 DPAPI 来加密存储这些密码。具体过程如下:
1. 密码加密:Chrome 浏览器在保存用户密码时,会将密码进行加密存储到SQLite数据库中,使用一个内部生成的密钥(通常与用户账户相关联)对密码进行加密。
用户密码存储位置C:UsersusernameAppDataLocalGoogleChromeUser DataDefaultLogin Data,存储的数据结构:
2. 使用 DPAPI 加密密钥:这个用来加密密码的密钥本身会被进一步使用 DPAPI 加密。DPAPI 利用用户的登录凭据作为加密材料,这意味着只有当该特定用户登录时,这些密码才能被正确解密。
DPAPI对加密密码的密钥进一步加密,密钥密文存储位置C:UsersusernameAppDataLocalGoogleChromeUser DataLocal State,保存在对应encrypted_key字段,密文为base64编码形式:
Base64解码后密文数据如图:
3. 存储加密数据:加密后的密码以及加密密钥被存储在本地的 Chrome 数据库中,通常是用户配置文件的一部分。由于密钥受到 DPAPI 的保护,即使数据库被非法访问,攻击者也难以直接读取到明文密码。
4. 解密流程:当用户再次访问需要密码的网站时,Chrome 会通过 DPAPI 解密之前加密的密钥,然后使用这个密钥来解密密码,从而实现自动填充登录信息的功能。
访问SQLite数据库,在用户登录的前提下,可以读取数据库中存储的明文密码信息:
1
平台
GNOME Keyring 是 Linux 系统下 GNOME 桌面环境的一个组件,用于安全地存储各种敏感信息,如密码、证书和加密密钥。
2
功能
密码管理:GNOME Keyring 可以安全地存储各种密码,包括 Wi-Fi 密码、网页密码、邮箱密码等,防止他人获取。
证书和密钥管理:除了密码,GNOME Keyring 还可以存储 SSL 证书和 SSH 密钥,方便用户在需要时使用。
加密存储:GNOME Keyring 的所有数据都被加密存储,只有在用户登录后才能访问,提供了一层额外的安全保护。
易用性:GNOME Keyring 集成在 GNOME 桌面环境中,用户可以方便地通过图形界面进行管理,如添加、删除和修改密码等。
3
举例
案例一:
微软的MSAL(Microsoft Authentication Library)是一个开源的身份验证库,用于帮助开发者简化与Microsoft身份平台的集成。MSAL 提供了一种统一的身份验证体验,支持OAuth 2.0和OpenID Connect标准,允许开发者在应用程序中验证用户身份,并获取对Microsoft云服务的访问令牌。GNOME Keyring 负责存储和加密 MSAL 使用的令牌,当 MSAL 需要令牌时,它会查询 GNOME Keyring实现获取令牌。如果找到有效的令牌,MSAL 将使用该令牌来访问 Azure 资源。如果 GNOME Keyring 中没有有效的令牌,MSAL 将发起网络请求到 Azure AD 以获取新的令牌,并将其存储在 GNOME Keyring 中以供将来使用。
案例二:
通过GNOME Keyring存取密钥。
import gi
from gi.repository import GLib
gi.require_version('Secret', '1')
from gi.repository import Secret
EXAMPLE_SCHEMA = Secret.Schema.new("org.mock.type.Store",
Secret.SchemaFlags.NONE,
{
"number": Secret.SchemaAttributeType.INTEGER,
"string": Secret.SchemaAttributeType.STRING,
"even": Secret.SchemaAttributeType.BOOLEAN,
}
)
# The attributes used to later lookup the password.
attributes = {
"number": "001",
"string": "testdemo ",
"even": "true"
}
Secret.password_store_sync(EXAMPLE_SCHEMA, attributes, Secret.COLLECTION_DEFAULT,
"Demo_PASS", "Everday is a good day", None)
password = Secret.password_lookup_sync(EXAMPLE_SCHEMA, { "number": "001" }, None)
# password will be null, if no matching password found
print('-----Password is ..-----' + password)
—END—
往期精彩合集
● 联想展示顶尖安全技术创新 亮相Black Hat ASIA 2024
● Intel® Neural Compressor CVE-2024-22476 漏洞分析
● 浅谈安卓应用安全
长
按
关
注
联想GIC全球安全实验室(中国)
原文始发于微信公众号(联想全球安全实验室):浅析操作系统中敏感数据处理与密钥管理