我们如何在不存储密钥的情况下提供敏感的加密数据?我应该为密钥使用用户定义的密码吗?

信息安全 加密 验证 密钥管理
2021-09-02 06:00:53

系统背景

  • 敏感数据(即信用卡号或 SSN)必须在系统中存储一段时间,以服务于公司的持续运营。

  • 任何人都可以插入敏感数据。只允许特定用户检索。

  • 在保护应用程序和辅助服务方面采取的预防措施。(即 HTTPS 连接、安装常规安全更新、研究/安全身份验证/会话管理、后端 SSH、保护整个应用程序免受 XSS、SQLi 等攻击)

  • 鼓励授权访问敏感数据的最终用户 PC 和网络上的安全实践,但可能无法从服务器端强制执行。

  • 该应用程序是从头开始设计的(不是追溯安全升级)

加密数据并不总是安全的

我认为任何安全专家都会告诉您加密机器上的敏感数据(即 SSN 或信用卡号),即使在生产过程中也是如此,因为即使采取了适当的预防措施和彻底的安全设计,总是存在某种风险,数据可能被泄露,服务器被黑,或者应用程序被利用。

我看到的加密问题是服务器还必须能够访问密钥虽然我们可以将其存储在 SQL 数据库之外。这也可以备份在纸上而不是通常的电子档案上。除了 SQL 注入或备份盗窃之外,还有许多可能的攻击,在这种情况下,密钥也会被盗,从而破坏加密。

前段时间我为密钥管理设想了一个解决方案,但直到今天我才将其发布为一个请求专业反馈的问题。

解决方案,请求反馈。

  1. 当用户帐户被授权访问/导出敏感数据时:

    • 需要重置密码,并进行非常高强度的检查。

    • User生成一个非对称 (RSA) 密钥对。公钥以明文形式存储。

    • 私有用户密钥使用从用户(强)密码派生的对称加密进行加密。

      → 要访问此用户的私人用户密钥,您需要猜测用户的密码。

    • 像往常一样,密码是用 BCrypt 保存的,与 Key Derivation 完全分开。

  2. 敏感数据由未经授权的用户提交。

    • Data生成一个非对称密钥对。公共数据密钥以明文形式存储。

    • 使用每个授权用户的公共用户密钥对私有数据密钥进行加密。

    • 敏感数据使用Data key加密。

      → 要访问敏感数据,需要确定私有Data key ,它不是直接存储的,但是如果你猜到Authorized User的密码就可以访问

    • 相同的数据密钥最多可重复使用 90 天。
      当没有数据关联时,旧键将被清除。

  3. 当授权用户登录时。

    • 使用 BCrypt 验证登录。

    • 使用至少 72 位熵生成会话令牌并传递给浏览器。

    • 私有用户密钥被临时解密(使用从密码派生的对称密钥),然后为当前会话重新加密。(使用从会话令牌派生的对称密钥)

      → 要访问敏感数据,可以猜测用户的密码,或者窃取会话令牌。

    • 服务器端仅存储会话令牌的简单 SHA-256 哈希。

  4. 登录时,授权用户的浏览器将传递会话令牌,该会话令牌用于解密用户密钥,用于解密适当的数据密钥,然后可以在适当的地方提供敏感数据。

因此,假设服务器或数据库遭到入侵,攻击者需要执行以下操作才能访问敏感数据。

  • 猜猜一小群授权人中较弱的密码之一,或
  • 从授权个人 当前使用的机器上窃取会话密钥
  • 或者,编辑操作软件以开始以纯文本形式存储数据(仅当入侵提供读+写访问权限时才有可能)

在我看来,这是可能的最可靠的安全实现。

A)这是推荐的吗?

B)这是在主流库或应用程序中实现的,还是这是一个相当独特的想法?

1个回答

以下是有关更大架构的一些一般注意事项,以防可以使用更多服务器来减少攻击面。在上述场景中,如果单个服务器被入侵,它可能会在管理员用户登录的一段时间内泄露敏感数据。

  1. 可能有两台 Web 服务器 - 一台用于客户端,一台用于管理员
  2. 另一台服务器上可能有数据库

客户端服务器将敏感信息插入数据库服务器而无法读取任何内容。

现在,只有管理员有权在数据库级别检索敏感信息。

以上可以通过多种方式实现,例如: - 数据库本身加密数据并根据其内置例程存储多个版本,例如 SQL Server,但是这需要在 SQL Server 本身上进行一些编码 - 这使得审计更好,如果每个管理员都使用自己的 SQL Server 凭据,因此系统管理员可以查看查看了哪些敏感记录,即使管理员的 Web 服务器遭到入侵。

  • 客户端 Web 服务器使用公钥加密数据并将其插入 SQL Server,并且在管理 Web 服务器上有私钥,但是,如果其中一位管理员将盗用并入侵管理 Web 服务器,他可能会使用单个读取所有敏感数据数据库用户和解密密钥

  • 如果客户端 Web 服务器受到威胁,可以在 SQL Server 上发起额外的攻击以检索所有信息。出于这个原因,可能会使用额外的中间副本,例如敏感数据被加密并通过 API 存储和发布在客户端服务器上,然后管理员服务器联系客户端计算机上的 API 并将数据存储在 SQL Server 中,从而删除任何访问从客户端服务器到 SQL Server

  • 如果资源有限,客户端和管理 Web 服务器可以在同一物理服务器上运行,或者在不同容器的云中运行。

  • 如果客户端网络服务器被入侵,通过安装恶意软件,可以读取所有敏感数据,因此,建议使用浏览器或javascript中内置的PKI,以便在客户端对信息进行加密-side,并发送到已经使用公钥加密的服务器。但是,如果客户端服务器被入侵,公钥可能会被替换甚至整个网站,这又提出了另一个问题,客户端浏览器如何验证应用程序和公钥的真实性?这是要求客户端应用程序,例如将网站加载到嵌入式浏览器中(因此它就像预安装的具有内置浏览器组件的 exe 文件),然后验证该应用程序的完整性。我一直在做这样的应用程序有一段时间了,这是这样做的充分理由:

这里有一些可能会有所帮助的东西。 子资源完整性

无论如何,可以使用 Nagios 或 Rundeck 通过对客户端服务器本身的网站、软件和密钥进行连续扫描来实现简单的网站完整性监控。另一件事是,如果密钥被替换,整个系统将停止工作,因为管理员将无法解密数据。

如果可以为该域签署任何给定的网站并且可以针对第三方检查该签名,那就太好了。也许浏览器扩展会很好地做到这一点。因此,如果我加载 Google.com,HTML 和 JavaScript 是由第 3 方签名的,因此如果它被替换,浏览器将不会运行它。

这只是稍微偏离主题,但可能会获得更多关于如何基本上处理敏感的用户提交数据的想法。