【问题标题】:What is the best way to encrypt a very short string in PHP?在 PHP 中加密非常短的字符串的最佳方法是什么?
【发布时间】:2010-09-11 07:03:47
【问题描述】:

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

是否有人对安全加密短字符串的最佳方法有任何想法以及为什么?有没有人有任何材料的链接,可以让普通程序员了解实际的加密场景?

【问题讨论】:

  • 3-20 个字符,这不是密码,是吗?单向加密几乎总是密码的更好选择。

标签: php encryption


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我强烈推荐 Chris Kite 的建议。如果不了解更多关于您在做什么、为什么以及您预期需要防范 AES-128 的威胁可能就足够了。使用对称加密的能力非常适合作为数据解密器和加密器的独立应用程序。正如 Chris KiteArachnid 所说,由于数据量小,建议您填充数据并使用随机初始化向量。

      更新:至于为什么......具有已知 IV 的纯文本并将其与捕获的密文匹配。简而言之,这就是彩虹表的工作原理。

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          【解决方案5】:

          如果您想在应用程序中加密和解密数据,您很可能希望使用对称密钥密码。 AES 是美国国家安全局认证的用于保护绝密数据的对称块加密算法,是您的最佳选择。 www.phpaes.com

          提供了一个纯 PHP 实现

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

          选择正确的加密算法是很好的第一步,但是对于一个安全的系统来说,有许多因素很难做到正确,例如密钥管理。那里有很好的资源,例如 Bruce Schneier 的 Applied Cryptography 和 Ross Anderson 的 Security Engineering(可在线免费获得)。

          【讨论】:

            【解决方案6】:

            是否有人可以解密它是否重要?如果您只是想稍微混淆一下,请使用 ROT13。这是老学校。

            【讨论】:

            • 你真的只是在加密帖子中建议 ROT13 吗?
            • 天哪,伙计。你会读...吗? “有没有人能解密有关系吗?” ROT13 是有效的加密。打破它是微不足道的,但这并不一定总是很重要。我已经很清楚了,不是吗?
            【解决方案7】:

            我猜任何单向加密算法(例如 Blowfish)都可以。河豚又快又开放。您可以通过 crypt() 函数使用 Blowfish。 AFAIK 没有加密算法特别适用于小字符串。不过要注意的一件事是,暴力破解如此小的字符串将非常容易。也许您应该加密字符串以及“秘密”盐值以提高安全性。

            【讨论】:

            • 更正:crypt() 版本不合适,因为它没有解密的方法。使用类似pear.php.net/package/Crypt_Blowfish 的东西。这将为您带来额外的优势,您不必担心安装额外的扩展程序。
            【解决方案8】:

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

            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;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-12
              • 1970-01-01
              • 2021-12-25
              • 2015-09-16
              • 2011-05-20
              • 1970-01-01
              • 2014-10-15
              相关资源
              最近更新 更多