[英]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.