PHP中的用户解密/加密|在会话中存储密钥

时间:2013-12-11 18:52:07

标签: php session encryption

所以我有这个网站,允许用户每天写。然后将其存储在纯文本的数据库中。这不是一个博客,所以一切都是私密的,我经常得到的最大抱怨是"我"仍然可以阅读他们所写的内容。它仍然不完美"私人的。我也不想成为泄露数千份私人日记的人。

因此,我的思路是如何将它仅仅私有化给他们。

  • 当他们登录时:key = sha1(salt +密码)并将此密钥存储在SESSION中(这有多安全?)

  • 当他们保存文字时:在将其保存到数据库之前用$ _SESSION ['键']对其进行加密

  • 当他们阅读已保存的内容时,请先使用$ _SESSION ['键']进行解密。

这样安全吗?另外加密/解密UTF-8的最佳方法是什么?

如果有人更改了密码,它必须解密/重新加密所有内容。

3 个答案:

答案 0 :(得分:3)

您应该在SESSION中存储密码的哈希值 永远不要在任何地方存储普通密码!!

另外,请考虑阅读此stackoverflow线程:Secure hash and salt for PHP passwords

要散列密码,您可以使用以下方法:

  • 为特定用户生成一个salt(salt是随机字符串),并将其存储在某个地方,或生成全局盐(在您的用例中)
  • 使用以下函数为密码生成哈希值,并将该哈希值存储在SESSION

function generate_hash($password) {
   $salt = "<some random string of characters>"; // do not change it later.
   return md5($salt . $password);
}

对于加密,您可以使用mCrypt库。典型的算法可以是:

$key = 'password to (en/de)crypt';
$string = 'string to be encrypted';

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

var_dump($encrypted);
var_dump($decrypted);

答案 1 :(得分:1)

您应该使用某种形式的加密。 PHP为此提供了mCrypt。逐点说明:

  1. 在$ _SESSION中以明文形式保存密码本质上是不安全的。至少,会话和数据库中都有hash it。然后你可以将哈希值相互比较。敏感数据绝不应存储在明确的任何地方
  2. 您可以使用mCrypt简化此操作。但是,我认为这里的重点是不正确的。我认为你应该更专注于从文本本身抽象用户信息,而不是散列所有这些“日记”文本。
  3. 无需使用密码。只需使用一个公用密钥并使用mcrypt即可。
  4. 我希望这有帮助!

答案 2 :(得分:0)

不要使用密码来加密密钥,密码不应该在逻辑中的任何地方使用,并且只能在登录时读取为哈希而不是纯文本。您可以使用其他内容(如用户电子邮件)生成密钥。