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

Posted

技术标签:

【中文标题】使用密码加密/解密数据,而数据库管理员无法解密【英文标题】:En/decrypt data using password without database admin being able to decrypt it 【发布时间】:2020-04-07 08:08:18 【问题描述】:

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

所以基本上,我需要某种公钥/私钥概念,我可以使用用户公钥对其进行加密,但只有他们有权访问他们的私钥来解密它。但是,使用实际的 RSA 密钥在可用性方面会很烦人,因为用户必须在某处写下他们的私钥。

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

例如,假设一个网站:

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

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

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

【问题讨论】:

我对这里的威胁模型有点困惑。服务器管理员不能在服务器上简单地读取明文吗?在这种情况下,它的加密方式无关紧要。另外,你在用户端没有与用户交互的应用吗? 我没有以明文形式存储任何内容;我有一些只有特定人才能访问的“内容”。因此,由于我不希望服务器管理员能够读取它,我需要以一种只能由给定用户解密的方式对该内容进行加密。如果我要使用标准 RSA 密钥,我可以简单地为每个用户存储一个公钥,该公钥将用于加密内容,并让用户保存他们的私钥以便他们可以对其进行加密。但我不希望用户必须记住一个巨大的密钥,所以我喜欢他们指定一个密码用作私钥,但需要一个相应的 publ @JamesReinstateMonicaPolk ic 键 【参考方案1】:

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

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

问题:

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

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

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

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

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

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

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

【讨论】:

这不是意味着私钥以明文形式存储吗?我想避免这种情况,因为这意味着数据库管理员基本上可以看到他们喜欢的任何数据。所以没有数据是真正私密的。 @Fly,私钥应该使用对称算法加密,用户密码作为密钥。因此,密钥存储在服务器上,但管理员无法访问密钥。

以上是关于使用密码加密/解密数据,而数据库管理员无法解密的主要内容,如果未能解决你的问题,请参考以下文章

SQL数据库里面后台的密码加密了密文是:128xwM4bvLVmvhz4zEtMlw== 请问如何解密。怎样查看是怎样加密的?

.net 中用户登录时密码加密 如何解密

安全与加密之加密算法,CA,openssl,证书管理

电脑文件夹加密后无法解密

非对称加密和对称加密

怎么把MD5加密过后的解密为明文密码?