在PHP中加密非常短的字符串的最佳方法是什么?

时间:2008-09-19 15:24:03

标签: php encryption

我想加密字符串,这些字符串可能只有大约三个或四个字符,但运行到大约二十个字符。散列函数(md5sha1crypt等)不适合,因为我希望能够解密信息。 mcrypt扩展程序有一系列令人生畏的可能性。

有没有人对安全加密短字符串和为什么的最佳方法有任何想法?有没有人有任何关于将休闲程序员引入实际加密方案的材料的链接?

8 个答案:

答案 0 :(得分:6)

我喜欢将GnuPG用于需要在服务器上加密的任何内容,然后可能在服务器或其他服务器上解密(通常是我的情况)。这允许额外的安全级别,因为在我的场景中加密服务器没有解密数据的密钥。它还允许更容易的手动解密。有一些好的包装器可用于各种语言(另一个优点),一个用于PHP的GnuPGP PHP Class

答案 1 :(得分:6)

默认情况下,

mcrypt链接到大多数PHP版本。它包含您可能需要的所有原语。如果不了解您正在加密的内容,您的威胁模型等等,很难就使用何种算法,操作模式等提出具体建议。

我可以肯定地说:使用短文本字符串,必须使用独特的随机初始化向量,这比以往任何时候都重要。否则,某人对加密数据进行各种攻击是微不足道的。

答案 2 :(得分:4)

我强烈推荐 Chris Kite 的建议。如果不了解您正在做什么,为什么以及您预计需要针对AES-128进行保护的威胁可能就足够了。使用对称加密的能力对于既是解密者又是数据加密者的独立应用程序非常有用。正如 Chris Kite Arachnid 所说,由于您的数据量很小,建议您填充数据并使用随机初始化向量。

  

更新:至于为什么....如果数据足够小,并且可以预测IV,则可以通过为每个组合生成密文来强制纯文本已知IV的纯文本,并将其与捕获的密文进行匹配。简而言之,这就是彩虹表的工作原理。

现在,如果您要在一台服务器上加密并在另一台服务器上解密,我会继续使用 pdavis 的建议。通过使用非对称方法,您可以将加密密钥与解密密钥分开。这样,如果加密数据的服务器遭到破坏,攻击者仍然无法解密数据。

如果您能够,它可以帮助社区更多地了解您的加密用例。正如我上面提到的,在评估安全控制时,正确理解合理的威胁是关键。

答案 3 :(得分:3)

是否有人可以解密它是否重要?如果您只是想对它进行模糊处理一点,请使用ROT13。这是旧学校。

答案 4 :(得分:2)

如果要在应用程序中加密和解密数据,则很可能需要使用对称密钥密码。 AES是NSA认证的对称块加密算法,用于保护绝密数据,是您的最佳选择。 www.phpaes.com

提供了纯PHP实现

对于您的使用,听起来像AES128就足够了。您将希望将CBC模式与随机初始化向量一起使用,否则相同的数据将始终生成相同的密文。

选择正确的加密算法是一个很好的第一步,但安全系统有很多因素很难做到,例如密钥管理。有很好的资源,例如Br​​uce Schneier的Applied Cryptography和Ross Anderson的安全工程(可在线免费获得)。

答案 5 :(得分:2)

我同意Chris Kite - 只需使用AES 128,这已经足够了。

我不确切知道您的环境,但我猜您是通过互联网以某种方式传输数据。

不要使用ECB,这对于相同的纯文本始终会产生相同的结果。

CBC模式是要走的路,不要忘记随机初始化向量。该向量必须与密文进行通信,并且可以明确发送。

关于您的数据,由于AES是分组密码,因此结果始终是块大小的倍数。如果您不想让观察者知道您的数据是短还是长,请添加一些填充以将其扩展到最大预期大小。

答案 6 :(得分:0)

任何单向加密算法,如Blowfish,我猜。河豚快速而开放。您可以通过crypt()函数使用Blowfish。 AFAIK没有加密算法在小字符串上工作得特别好。但有一点需要注意的是,强行这样的小字符串将非常容易。也许您应该加密字符串以及“秘密”盐值以获得额外的安全性。

答案 7 :(得分:0)

你可以使用一般的编程思路而不依赖于内置的加密/解密函数示例创建一个函数调用它

function encryptstring($string) {

$string_length=strlen($string);
$encrychars=""; 
/**
*For each character of the given string generate the code
*/
for ($position = 0;$position<$string_length;$position++){        
    $key = (($string_length+$position)+1);
    $key = (255+$key) % 255;
    $get_char_to_be_encrypted = SUBSTR($string, $position, 1);
    $ascii_char = ORD($get_char_to_be_encrypted);
    $xored_char = $ascii_char ^ $key;  //xor operation
    $encrypted_char = CHR($xored_char);
    $encrychars .= $encrypted_char;
} 
/**
*Return the encrypted/decrypted string
*/
return $encrychars;
}

在包含要包含要加密的ID的链接的页面上

   /**
    *While passing the unique value to a link
    *Do the following steps
    */

    $id=57;//or if you are fetching it automatically just pass it here
     /**
     *For more security multiply some value
     *You can set the multiplication value in config file
     */
     $passstring=$id*346244;
     $encrypted_string=encryptstring($passstring);
     $param=urlencode($encrypted_string);
     /**
     *Derive the url for the link
     */
     echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ;

在单击链接后打开的目标文件

     /**
      *Retriving the value in the target file
      *Do the following steps
      */
      $fetchid=$_GET['aZ98#9A_KL'];
      $passstring=urldecode(stripslashes($fetchid));
      $decrypted_string= encryptstring($passstring);
      /**
       *Divide the decrypted value with the same value we used for the multiplication
       */
      $actual_id= $decrypted_string/346244;