使用密码加密/解密数据,而数据库管理员无法解密数据

时间:2019-12-13 21:15:34

标签: encryption key rsa password-protection

这是一个更具概念性的问题,但是我试图一次仅将某些内容提供给特定用户。为此,我考虑过使用用户密码作为加密密钥。但是,这样做的问题是,如果我使用明文密码对其进行加密,那么我将无法进行任何加密,因为我显然在数据库中存储了哈希版本。如果我使用哈希密码对其进行加密,那么任何数据库管理员都将能够读取每个用户的内容。

因此,基本上,我需要某种公共/私有密钥概念,我可以使用用户的公共密钥对其进行加密,但是只有他们有权访问其私有密钥才能对其进行解密。不过,就可用性而言,使用实际的RSA密钥会很烦人,因为用户必须在某个地方写下其私钥。

我是否有一种聪明的方式来存储数据,使得只有特定用户才能看到它,并且可以通过他们设置的密码以某种方式访问​​它们而又无法以服务器管理员的身份查看他们的数据?

例如,假设有一个网站:

随机人选择一个接收者,编写一条消息。该消息应使用某种形式的公钥以加密形式存储在数据库中。

接收者输入密码(最好不是一个巨大的RSA密钥,而是一个标准的密码),在服务器端,此密码将被视为某种形式的私钥,以便解密数据并将其发送回给服务器。客户。

因此,基本上,我想将简单的密码短语视为私钥,并为其生成相应的公钥。

1 个答案:

答案 0 :(得分:1)

您似乎想使用相同的密码进行身份验证和加密。

让我们假设仅将密码的哈希存储在数据库中(应该如此)。

问题:

  • Web /移动/桌面应用程序的“记住我”功能将使加密功能无法实现,因为用户可以通过令牌而无需密码登录。
  • 当通过https以纯文本格式传输用户密码时,管理员可以拦截登录请求以了解用户密码(简单的基础结构重新配置允许管理员嗅探流量)。

在以下情况下,有一种方法可以使用相同的密码来保护传输安全:

  • 您更改身份验证过程的方式是,用户仅将哈希发送给服务器哈希而不是纯文本密码
  • 并将在客户端保存纯文本密码(用于“记住我”的情况)

然后,您可以在注册期间生成密钥对,并将加密的私钥保存在服务器上。 这样,即使在客户端重新安装后(Web /移动设备/桌面),您也可以访问私钥。

因此,登录后,您需要从服务器请求私钥,并使用用于身份验证的密码来解密私钥。

如果您相信管理员(或其他任何人)将不能与软件(特别是在密钥交换阶段)进行干涉,那么您就有办法实现所需的功能。

这将是防黑客的解决方案,直到有人修补您的代码并且系统中的每个用户都得到其他用户的错误公共密钥为止。