我正在构建一个简单的网站,用户可以在其中上传文本(注释)。一个注释将有一个标志“私人”,如果是真的,我想加密它,以便即使我(谁可以访问数据库)能够读取私人注释。 我知道加密是通过密钥完成的,而我现在能想到的最好的密钥就是用户密码。显然,密码被散列到数据库中,但我可以在$ _SESSION登录时保存它。
这是个好主意吗?
例如,在cryptobin.org中,要求用户输入密码,但在我的网站中,已注册的用户在登录时插入密码,我不想每次上传他的笔记时再次询问新内容而且,我再说一遍,我需要这一切,因为我想保护他的笔记。
对我而言,加密的工作原理可能并不十分清楚;在0bin.net,它声称粘贴是加密的,但没有要求密钥。 你能解释一下吗?
答案 0 :(得分:1)
密钥加密基于拥有秘密的前提。
明文+算法+秘密→密文
密文+算法+秘密→明文
您提供算法,明文/密文是感兴趣的主题,持有秘密的一方拥有最后一块拼图,从而具有最终的力量。
从这个角度来看,用户的密码是一个很好的选择,因为只有用户应该知道它而没有其他人。在实践中这取决于您真的无法访问此密码。如果您存储密码服务器端,那么显然您拥有密码,如果您愿意,可以使用它来解密密文。
现在,您提议的是会话中密码的临时存储。那很好,但随后它就变成了风险评估。谁可以从会话中获取密码?除非您的服务器遭到入侵,否则希望除了您之外没人。如果你愿意的话,这仍然会给你一个临时机会来解密密文。此外,以任何形式保留明文密码都会增加它被泄露到某个地方的可能性(服务器日志,内存转储等)。
如果您在处理秘密时受到信任,则需要保护与该秘密有关的所有内容。
这不是不可行的,但取决于你对此有多认真,你要保护的信息有多敏感,以及你想要防止多少可能的攻击场景,这可能会变得相当复杂并一直到运行代码的服务器的物理安全性。
另一种方法是执行所有加密客户端(在本机应用程序中,或浏览器中的Javascript),这将从服务器中消除很多责任。它会打开新问题(您现在需要确保您的Javascript不会被篡改),但这些更容易管理。
@Thilo总结了0bin的工作原理。 随机生成的秘密是生成的URL的一部分,根本不存储在服务器上,并且所有加密和解密都在浏览器中进行。