我正在设计一个可供客户通过现有 Web 应用程序访问的密码库。客户是小型(并且大多是非技术)企业,它们不使用密码管理器,但正在使用将添加密码库的现有应用程序。该(子)系统的目标是为通常需要由多个内部方(例如企业所有者和内部会计师)访问的企业安全地存储凭证。
我已经建立了一个如何工作的模型,我希望得到一些关于它的安全方面的反馈。
密码作为键 -> 值对输入,这样键就是对密码用途的描述。有多个值:密码可用的 url、关联的用户名和密码本身。密钥(它是对凭据的描述,例如网站名称)以明文形式存储,而所有值都被加密。这些数据存储在 MySQL 数据库中,运行在只能由应用程序服务器访问或基于密钥的身份验证的服务器上。
当企业首次设置密码库时,企业会输入主密码,并在使用 bcrypt 进行哈希处理后为公司存储在 MySQL 数据库中,成本为 15(32,768 次内部 bcrypt 迭代)。
接下来,企业可以存储 key -> value(s) 凭证对。给定密钥的值(密码、关联的 URL、用户名等)使用 AES-256-CBC 进行加密,以提供静态数据的机密性。
接下来,使用 HMAC(AES 初始化向量的 SHA256 哈希,与密文连接,将派生的密钥从 PBKDF2 传递到用于生成此摘要的库函数)对值进行签名,以确保数据的完整性静止时(例如,如果要修改密文,MAC 验证将失败,并且在我的应用程序中会抛出解密异常,因此不会将不正确的明文密码发送回客户端)。
用于 AES 加密/解密的密钥是使用 PBKDF2(通过 OpenSSL)生成的。我已将 PBKDF2 配置为完成 100,000 次迭代,并应用 32 字节盐(存储在数据库中,并使用返回加密安全伪随机字节的函数生成),并使用 SHA256 作为加密散列算法。当请求到达需要加密或解密存储数据的 Web 应用程序时,会生成此密钥。然后,密码数据以纯文本格式发送回客户端 Web 浏览器,但在传输过程中使用 HTTPS 进行保护。主密码存储在用户的会话中,因此每个会话只需输入一次,以增加系统的可用性。
整体系统/网络架构如下:
请注意,图片中线的左侧是数据中心。我假设这个网络是可信的,并且 TLS 在负载均衡器处终止。所有应用程序服务器和数据库都位于同一个数据中心内,并使用它们的私有(不可路由)IP 地址相互访问。
该系统的限制是无法重置忘记的主密码。我对此表示同意,并且会向企业推荐,如果他们担心忘记它,可以将其写在一张纸上并将其存储在他们企业的实体保险库中(主要是餐馆、啤酒厂、酒吧等) .,所以物理保险库很常见)。还提供密码提示选项。
问题:
鉴于上述设计,您看到了哪些潜在的漏洞或安全问题?
我可能还会聘请一家应用程序安全公司来查看事情(考虑到在构建此程序时可能会犯错误的严重性),但我想我会先在这里问。干杯!
注意:可能会选择使用 AEAD(例如 AES-256-GCM)而不是密码块链接模式。