Php 将文本加密到数据库中

Php 将文本加密到数据库中,php,encryption,Php,Encryption,我正在建立一个简单的网站,用户可以在其中上传文本片段(注释)。便笺将有一个标志“private”,如果为true,我希望对其进行加密,以便即使是我(可以访问数据库的人)也无法读取该便笺。 我知道加密是通过一个密钥进行的,我现在能想到的最好的密钥就是用户密码。显然,密码已散列到数据库中,但我可以在登录$u会话时保存它 这是个好主意吗 例如,在cryptobin.org中,用户被要求输入密码,但在我的网站中,已经注册的用户在登录时插入密码,我不想在每次他上传他的便笺时再问一些新问题,我重复一遍,我需

我正在建立一个简单的网站,用户可以在其中上传文本片段(注释)。便笺将有一个标志“private”,如果为true,我希望对其进行加密,以便即使是我(可以访问数据库的人)也无法读取该便笺。 我知道加密是通过一个密钥进行的,我现在能想到的最好的密钥就是用户密码。显然,密码已散列到数据库中,但我可以在登录$u会话时保存它

这是个好主意吗

例如,在cryptobin.org中,用户被要求输入密码,但在我的网站中,已经注册的用户在登录时插入密码,我不想在每次他上传他的便笺时再问一些新问题,我重复一遍,我需要所有这些,因为我想保护他的便笺不被我发现

我可能不太清楚加密是如何工作的;在0bin.net中,声称粘贴是加密的,但不要求密钥。
你能解释一下吗?

密钥加密是以拥有秘密为前提的

明文+算法+秘密→ 密文
密文+算法+秘密→ 明文

你提供了算法,明文/密文是感兴趣的主题,而持有秘密的一方拥有谜题的最后一块,从而拥有最终的权力

从这个角度来看,用户的密码是一个很好的选择,因为只有用户应该知道它,没有其他人知道。实际上,这取决于您是否真的无法访问此密码。如果您将密码存储在服务器端,则显然您拥有密码,并且如果您选择,可以使用密码解密密码文本

现在,您建议在会话中临时存储密码。这很好,但接下来就变成了风险评估。谁可以从会话中获取密码?希望除了你没有人,除非你的服务器被破坏了。如果您愿意的话,您仍然有机会自己解密密码文本。此外,以任何形式保留明文密码都会增加密码被过滤到某处(服务器日志、内存转储等)的可能性

如果你被信任处理一个秘密,你需要保护所有与该秘密有关的东西。

这并非不可行,但取决于您对此的重视程度、您所保护的信息的敏感程度以及您希望防止的可能攻击场景的数量,这可能会变得相当复杂,并会一直影响到您的代码所运行的服务器的物理安全性



另一种方法是在客户端(在本机应用程序中,或在浏览器中使用Javascript)执行所有加密,这将免除服务器的许多责任。它带来了新的问题(您现在需要确保Javascript不被篡改),但这些问题更容易管理



很好地总结了0bin的工作原理。随机生成的秘密是生成的URL的一部分,根本不存储在服务器上,所有加密和解密都在浏览器中进行。

您可以(应该)探索PHP加密,了解
密钥
iv
,从开始。对于您的项目,例如,
key
iv
对于每个用户来说可能是静态的,但是像盐一样随机。保存用户密码:不是一个好主意。您可以在客户端进行加密,这样至少密码不会离开浏览器。@DeDee:但是服务运营商可以解密用户的消息。0bin有一个“如何工作”部分:本质上:浏览器生成随机密钥,密钥放在URL的“散列”部分(不会发送到服务器),如果你有完整的URL,你可以解密only@web2students.com这有什么帮助呢?“这就免除了服务器的很多责任”。这似乎是0bin的重点。他们的常见问题解答明确指出,他们并不真正关心客户端的密钥管理,他们只想保护服务器不受法律问题的影响,这些法律问题围绕着必须以可能被窃取或被迫恢复的形式存储敏感数据。对。如果你能将服务器降级到只存储随机乱七八糟的内容,那么你已经移除了很多攻击点。。。。至少是你自己:-)私人便条不能共享,但“未列出”可以(如pastebin)。无论如何,我已经决定将密码保存到$\u会话中;如果用户信任我,我不会在登录/注册过程中出于恶意目的将密码永久保存在某个地方,他可以信任我,我不会在任何地方回显密码。我也意识到,正如你所解释的,这可能不是这种方法的唯一问题,但我的网站更像是一种练习,不是用来存储关键内容的。