操作系统在哪里以及如何保存用户帐户的密码?

信息安全 操作系统
2021-08-31 11:35:30

操作系统(例如 Windows)在哪里保存密码?他们是否以纯文本形式存储它们?他们是否使用诸如 TPM 之类的硬件模块?这些方法通常被认为是安全的吗?

1个回答

Windows 将其密码存储在所谓的安全帐户管理器数据库或 SAM 数据库中。这是一个存在于注册表中的文件,并且在 Windows 运行时对其的访问受到严格控制;但是,可以运行进程的本地管理员NT AUTHORITY\SYSTEM可以访问它 -看看 NT 将 SAM 数据库存储在哪里?.

至于使用的哈希,它们是LMNTLM哈希。已经进行了各种尝试来破解 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() 是第一个重复应用哈希以使检查哈希变慢的操作系统之一)——这很关键,因为加密密码可以通过找到加密密钥。显然,在这两种情况下,密码输入的安全性取决于您进入高特权区域的能力;此后,密码被散列,并且必须使用散列反向技术(例如彩虹表)来破解,散列设计旨在应对这种技术。