在PHP中安全密码加密/解密字符串

时间:2011-08-04 15:18:06

标签: php string security encryption passwords

我想知道是否存在一种简单但安全的方法来加密字符串(而不是密码),并在PHP中使用未存储在服务器上的密码。

我已经检查了A reversible password encryption routine for PHP,但如果入侵者有权访问服务器和来源,我不确定它是否足够安全。

我们谈论的是一个自动系统,其中计算机向服务器发送请求,该服务器将信息存储在日志中。所以我想我可以在请求标头中发送加密密码,最好加密,但是如果不在服务器上以某种方式存储密码就很难解密。等等,我想我可能会让事情变得复杂太多,但我希望你明白这一点......即使黑客完全控制服务器,这也意味着保证信息的安全。

3 个答案:

答案 0 :(得分:4)

如果我理解正确,您的目标是由服务器加密的日志。请求是以简单方式发送的,但是您希望记录类似于每个用户访问统计信息等的内容,并且您认为这些数据是保密的,因此它应该由服务器加密并且也可以由服务器解密,如果必要的。

如果是这种情况,实际上并不是太复杂。

  • 生成服务器要使用的加密密钥(AES将是一个不错的选择)。
  • 您将此密钥存储在一个文件中。
  • 确保应用程序和只有少数选定人员可以访问该位置。最糟糕的情况是它会在您的公共文件中提供,任何人都可以从网上下载它。所以把它放在远离公共资源的文件夹中:)
  • 使用基于密码的加密e.g. PBKDF2 in RFC 2898加密该文件。

然后您将意识到您创建了一个鸡蛋问题 - 该文件再次需要密码才能让服务器访问存储在其中的密钥。但这就是诀窍 - 您必须在手动启动服务器时输入密钥,这就是您需要的短暂组件。该文件的密码应该是带外信息(例如放置在物理保险库中),而不是计算机本身的任何地方。

另一种选择(但可能不太安全,因为密码将以某种物理形式出现)是依赖于特定于操作系统的“密码保险库”,例如Windows {Isolated Storage

答案 1 :(得分:2)

这个似乎符合您要求的一个选择是使用公钥/私钥加密。如果您让用户使用公钥加密字符串,然后将加密数据存储在服务器上,则攻击者无法解密数据。

当/如果您需要解密数据时,只需将其复制到您拥有私钥的位置并将其用于解密。

答案 2 :(得分:0)

我会和Mcrypt一起在php中加密/解密数据 我选择的算法将是双重的。 您将需要一个密钥来加密/解密数据并通过请求发送它可能是一个安全问题,除非您实施了ssl。 如果加密应该是请求不是实时的事情,那么你只能在控制台中执行脚本,这样密码就不会存储在服务器上。

加密/解密的代码很简单:

$encrypted= mcrypt_ecb(MCRYPT_TWOFISH, $key, $input, MCRYPT_ENCRYPT);
$decrypted= mcrypt_decrypt(MCRYPT_TWOFISH , $key, $data, MCRYPT_DECRYPT);