【问题标题】:Obfuscating POST variables between Javascript & PHP在 Javascript 和 PHP 之间混淆 POST 变量
【发布时间】:2011-09-22 05:22:21
【问题描述】:

理想情况下,我希望加密变量,因此无法弄清楚它们,但是鉴于客户端将通过 javascript 发送变量并且如果他们看到代码可以解密任何内容,我正在寻找替代方案。

我正在考虑使用返回类似于 md5 或 sha1 的 HEX 的东西,但要进行加密,然后如何将服务器时间或日期合并到变量中,以便加密仅在 1-2 分钟内有效。

javascript 将具有一个混淆/最小化函数,该函数将根据 javascript 及时加密,然后将其发布到 php。只要服务器的日期/时间在 X 分钟以内,它就会正确解密。

我想向它发送看似随机的数据,然后取回看似随机的数据。我不希望它是相同的数据。

这是最好的方法吗?我只是想阻止那些试图使用 HTTP 嗅探器的人。我知道一旦他们获得了 javascript 源代码,只要有足够的时间/了解正在发生的事情,没有什么能阻止它。

如果您要发布实际代码,请记住该功能/能力应该同时存在于 javascript 和 PHP5 (

编辑:SSL/HTTPS 是不可能的。

【问题讨论】:

  • 你想用这种加密方式达到什么目的?你想保护什么?
  • 我正在发送用户 ID、版本号。我试图阻止用户忽略所需的更新或将他们的用户 ID 编辑为其他人的。
  • 使用 SSL。讨论完毕。它将开箱即用地加密所有内容,您的代码只需使用“https”网址而不是“http”。其他的都是没有意义的。
  • 我会推荐 SSL,并在变量上附加某种校验和。这样就可以了。
  • 无论如何,除了 HTTPS 之外什么都不会是安全的,所以你还是放弃吧。如果信息的价值足以保护,那么它就足以投资于克服任何薄弱的安全方案。 (如果您能解释一下为什么 HTTPS“不可能”,这可能会有所帮助,因为它是一个强大、可靠的成熟标准,可供所有人免费使用。)

标签: php javascript encryption


【解决方案1】:

如果您想阻止人们嗅探您的网络流量,请使用 https 而不是 http。

如果您应该学习一件事,那就是加密很难。真的很难。如果您尝试自己做,您将不会做对,并且可能会犯一些微妙的错误,以后可能会咬到您。最好将加密留给知道自己在做什么的人。

【讨论】:

  • 还有来自用户空间的一切,都可能是伪造的。
  • Fiddler 可以动态解密 https 流量
【解决方案2】:

我认为 HTTPS 是不可能的。

你有想过 ROT 吗?至少愚蠢的简单实现:

var output = "";
for(var i = 0; i < input.length; i++)
{
    char = ( input.charCodeAt(i) + SOME_NUMBER ) %255;
    output += String.fromCharacterCode( char )
}

然后,在 PHP 中

$chars = $_POST['chars'];
$output = "";
for($i = 0; $i < strlen($chars); $i++ )
{
    $char = ord($chars[$i]) - SOME_NUMBER;
    if($char < 0 )$char += 255;
    $output .= chr($char);
}

【讨论】:

  • 是的,我想到了 ROT,这是我的第一选择。然而,一对一的“加密”太容易猜到了。我正在寻找数据几乎每次都变化的东西。
  • 将 SOME_NUMBER 设为舍入到当天的日期戳。或每小时。您的 JS 和 PHP 可能会在当天午夜前后的几秒钟内出现分歧,但这不太可能是一个大问题。或者您可以在消息开头以明文形式发送密钥;您可以散列当前日期时间并发送它,只要它们的密钥是固定长度的,您就不会遇到任何问题。
  • 我结束了使用 Dire 的方法。到目前为止,这是我的 Javascript:jsbin.com/asanuq/2/edit 代码每 30 秒更改一次。
  • OH 和 PS:JS 中的 fromCharacterCode 应该是 fromCharCode 并且 PHP 函数也没有解码?
  • PHP 的$chars[$i] 应该是substr($chars, $i, 1)
【解决方案3】:

如果您想对 Javascript 进行一些强大的 PKI 加密,您应该检查jcryption

【讨论】:

    【解决方案4】:

    我建议 AES 加密是一个不错的选择。你可以在这里找到 JavaScript 库https://code.google.com/archive/p/crypto-js/ 和 PHP 之一 https://packagist.org/packages/blocktrail/cryptojs-aes-php

    现在在 PHP 方面:

    <?php
    include "vendor/autoload.php";
    use Blocktrail\CryptoJSAES\CryptoJSAES;
    
    $passphrase = "secret";
    $text = "example value";
    
    $encrypted = CryptoJSAES::encrypt($text, $passphrase);
    echo "Encrypted: ", $encrypted, PHP_EOL;
    

    它输出:

    Encrypted: U2FsdGVkX1/JVv/nS7aExFZiatvG8Lha7MflNsfuLHo=
    

    我们获取加密代码并在 JavaScript 中解密:

    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
      </head>
      <body>
        <script>
          const passphrase = "secret",
                encrypted = "U2FsdGVkX1/JVv/nS7aExFZiatvG8Lha7MflNsfuLHo=";
                decrypted = CryptoJS.AES.decrypt( encrypted, passphrase );
          console.log( decrypted.toString( CryptoJS.enc.Utf8 ) );
        </script>
      </body>
    </html>
    

    在浏览器中启动此 HTML 后,您将获得 JavaScript 控制台:

    example value
    

    因此,您可以在 PHP 中加密敏感数据,并在客户端应用程序中使用 JavaScript 获取并解密。你可以在相反的方向做。只是不要忘记混淆 JavaScript 并使秘密看起来像一些 JavaScript。

    但您知道它并不真正安全 - 付出相当大的努力才能找出加密方法,找到秘密并揭开数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2012-10-20
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多