encryption - 使用密码加密/解密数据,而数据库管理员无法解密
问题描述
这是一个更具概念性的问题,但我试图让某些内容一次仅对特定用户可用。为此,我考虑使用用户密码作为加密密钥。但是,问题在于,如果我使用明文密码对其进行加密,我将无法加密任何内容,因为我显然将哈希版本存储在我的数据库中。如果我使用散列密码对其进行加密,那么任何数据库管理员都将能够读取每个用户的内容。
所以基本上,我需要某种公钥/私钥概念,我可以用用户公钥对其进行加密,但只有他们有权访问他们的私钥来解密它。但是,使用实际的 RSA 密钥在可用性方面会很烦人,因为用户必须在某处写下他们的私钥。
有没有一种聪明的方法让我以只有特定用户才能看到的方式存储数据,通过他们设置的密码以某种方式访问,而无法以服务器管理员的身份看到他们的数据?
例如,假设一个网站:
随机人选择接收者,写消息。该消息应使用某种形式的公钥以加密形式存储在数据库中。
接收者输入他们的密码(最好不是巨大的 RSA 密钥,而是标准密码),在服务器端,该密码将被视为某种形式的私钥,以便解密数据并将其发送回客户端。
所以基本上,我想把一个简单的密码当作私钥,并为它生成一个对应的公钥。
解决方案
看起来您想对身份验证和加密使用相同的密码。
让我们假设只有密码的哈希值存储在数据库中(应该如此)。
问题:
- Web/移动/桌面应用程序的“记住我”功能将使加密功能无法使用,因为用户可以通过令牌无需密码登录。
- 管理员可以拦截登录请求以了解用户密码,同时通过 https 以纯文本形式传输(简单的基础架构重新配置允许管理员嗅探流量)。
在以下情况下,有一种方法可以使用相同的密码来保护传输:
- 您以用户仅向服务器发送哈希而不是纯文本密码的方式更改身份验证过程
- 并将在客户端保存纯文本密码(用于“记住我”场景)
然后您可以在注册期间生成密钥对并将加密的私钥保存在服务器上。这样,即使在客户端重新安装(网络/移动/桌面)之后,您也可以访问您的私钥。
因此,在登录时,您从服务器请求您的私钥并使用用于身份验证的密码来解密您的私钥。
如果您相信管理员(或其他任何人)将无法干预软件(尤其是在密钥交换阶段),那么您就有办法实现您需要的功能。
这将是防黑客的解决方案,直到有人修补您的代码并且系统中的每个用户都获得了其他用户的错误公钥。
推荐阅读
- docusignapi - 如何使用嵌入式签名并将电子邮件发送给其他收件人 Docusign?
- javascript - 在 javascript 中, ! 在数组括号前签名吗?
- c# - 当 App A 的身份验证失败时,.NET OpenIdConnect 重新向 App B 进行身份验证
- regex - 删除新行,但如果包含在文本边界内则不删除
- c++ - 当 QObject 通过引用传递时,C++ 信号的参数在 QML 中显示为“未定义”
- elasticsearch - 如何在弹性搜索匹配查询中提升单个单词
- php - 查找至少 10 个字符的 src 属性
- .net - 如何计算 JObject 的唯一 Hashcode
- python - python解析xml获取值
- javascript - 使用 JS 和 JSON 未正确使用所有者值创建记录