操作系统(例如 Windows)在哪里保存密码?他们是否以纯文本形式存储它们?他们是否使用诸如 TPM 之类的硬件模块?这些方法通常被认为是安全的吗?
操作系统在哪里以及如何保存用户帐户的密码?
Windows 将其密码存储在所谓的安全帐户管理器数据库或 SAM 数据库中。这是一个存在于注册表中的文件,并且在 Windows 运行时对其的访问受到严格控制;但是,可以运行进程的本地管理员NT AUTHORITY\SYSTEM可以访问它 -看看 NT 将 SAM 数据库存储在哪里?.
至于使用的哈希,它们是LM或NTLM哈希。已经进行了各种尝试来破解 NTLM;但是,众所周知,LM 已损坏,因此尽管早期版本的 Windows 使用,但 Vista 不默认使用它。微软显然还加密了数据库,使其更难离线分析。
操作系统密码安全的关键是减少它们被拦截的机会,因此也值得研究谁和什么可以访问它。在 Windows 方面,LSASS 或本地安全机构子系统服务负责验证和创建用户凭据。因此,任何挂钩或替换 LSASS 的尝试都是尝试获取密码输入。
就登录屏幕而言,过去可以使用GINA DLLS 重新设计它——例如,许多人这样做是为了支持指纹认证。然而,自定义 GINA 是很多东西中很难编写并可能带来安全风险的,因此 Microsoft 在 Vista 中重建了它:参见凭据提供程序框架,该框架将自定义代码从 GUI 对象中移除 1 级,这样更安全(Vista确实包含改进,对于所有人的批评)。
现在,Linux。从 Linux 身份验证的架构开始可能会更好——大多数现代 Linux 发行版使用可插入的身份验证模块,可以为各种数据库、远程、本地等进行配置。这些可以配置为可选的、强制的或“众多选项之一” “ 如果你喜欢。默认的 pam 模块验证其元数据存在于其中的用户/etc/passwd(以便任何程序都可以只读方式查询它,例如查找用户的主目录),并且密码单独存储在/etc/shadow. 直接来自维基百科(影子密码):
/etc/shadow 通常包含以下用户信息:
用户登录名
盐和散列密码或状态异常值,例如:
$id$salt$encrypted,$id使用的散列算法在哪里(在 linux 上,$1$代表 MD5,$2$是 Blowfish,$5$是 SHA-256 和$6$SHA-512,请参见crypt(3) 联机帮助页。“NP”或“!” 或 null - 没有密码,帐户没有密码。
- "LK" 或 "*" - 帐户被锁定,用户将无法登录 "!!" - 密码已过期
- 自上次密码更改纪元以来的天数
- 允许更改前的天数
- 需要更改前几天
- 到期警告天数
- 帐户不活动前几天
- 帐户到期后的天数
- 预订的
如您所见,在 Linux 上可用于散列算法的内容完全是可选的。数据库的安全性/etc/shadow完全取决于您是否可以成为 root,因为 root 用户被授予访问权限。
两种操作系统本质上都使用多种技术对密码进行哈希处理(我认为默认 DES 模式下的 crypt() 是第一个重复应用哈希以使检查哈希变慢的操作系统之一)——这很关键,因为加密密码可以通过找到加密密钥。显然,在这两种情况下,密码输入的安全性取决于您进入高特权区域的能力;此后,密码被散列,并且必须使用散列反向技术(例如彩虹表)来破解,散列设计旨在应对这种技术。