繁体   English   中英

在PHP会话中编辑加密数据

[英]Editing encrypted data in a PHP session

我正在用PHP构建一个密码管理器,用户可以在其中使用主密码存储和访问一组密码。 数据库是一个简单的XML文件,使用mcrypt加密并存储在磁盘上。

编辑:每个用户都有自己的数据库文件。

问题是:当用户编辑其密码之一时,必须再次解密,更改和加密数据库。 每次用户编辑内容时,我都必须知道他的主密码才能访问数据库,因此我必须将密码临时存储在服务器上的某个位置,或者用户必须为每次更改输入密码。

我知道将密码存储在会话变量中会导致安全问题,那么还有另一种更安全的方法吗?

注意 :我没有root或物理访问托管该项目的服务器的权限,因此无法更改任何配置。

一旦将主密码存储在磁盘上,任何加密都是完全无用的,只会降低性能。

如果有人在会话期间拔出HDD,则可以轻松地使用该密码打开文件。

如果您是一名不熟练的管理员,那您就...完成了,因为他可以在打开文件前存储密码。 因此,我认为admin在您的身边,并且您的系统配置正确。

您可以做的第一件事就是磁盘加密 这实际上将大大提高安全性。 如果有人在会话中使用明文密码偷走了您的HDD,则无论如何他将无法读取它。

比使用HTTPS ...使用密码时,这应该是强制性的,如果仅使用HTTP,则整个计划就毫无用处。

在PHP中...我不确定您是否可以做任何事情。 但是,当您使用https时,您可以执行以下操作:

  • 将密码存储在$pass
  • 生成临时随机加密密钥( $rand
  • 存储用$rand加密的密码(我只是使用XOR)
  • $rand存储到$_COOKIE变量中
  • 使用$_COOKIE值对每个请求解密主密码

例:

$pass = 'iddqd';
$rand = 'abcde';
echo base64_encode( $pass^$rand); // CAYHFQE=
$_COOKIE['phrase'] = $rand;
$_SESSION['password'] = base64_encode( $pass^$rand);
unset( $pass);

// And on every other request:
$pass = $_COOKIE['phrase'] ^ base64_decode($_SESSION['password'])

有什么附加值? 以纯文本格式存储密码仅依赖于经过身份验证的磁盘访问。

生成临时短语并将其存储在用户浏览器中(并且仅在用户端)使它依赖于经过身份验证的磁盘访问+用户身份验证生成的cookie值(应该很难欺骗)。

还有一件事,当您使用https时,您不必担心在每个请求中发送短语(您可以每10-100-1000个请求更改一次)。

完全不同的选择是永远不要将纯文本存储在服务器上(既不在磁盘上也不在内存中)。 您提供给客户端的JavaScript可以完全根据客户端输入的主密码在客户端的浏览器中加密/解密数据(因此,主密码也永远不会传输-记住两个人之间的秘密只有在以下情况下才是秘密)一个死了!

在服务器上,您将仅存储数据的加密版本。 数据在发布到站点时已经被加密。 当站点将数据存储到浏览器时,数据仍然被加密。

这解决了很多安全问题。 主动恶意的Web服务器仍可能危及安全性,但前提是用户正在使用JavaScript主动加载初始页面。 被动攻击者(即使他们随时都可以看到服务器的整个系统内存)也无法采取任何措施来破坏安全性。

为了使用户登录到站点(以便能够访问数据密码文本),可以在传输主密码之前使用与主密码不同的密码, 或者对主密码进行JavaScript哈希(加盐!)。到服务器(您仍应存储散列并再次加盐)。

您可能要考虑不要将密码用作直接加密密钥。 尝试做这样的事情:

$_SESSION['myKey'] = md5($_POST['userName'] .$_POST['password']); //create a hash based on multiple predictable criteria

...然后使用$ _SESSION ['myKey']代替密码。 这样,当您可以将他们的密钥保持在会话状态而不会被暴露时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM