【问题标题】:Safe encryption for short strings in PHP and JavaPHP 和 Java 中短字符串的安全加密
【发布时间】:2011-06-07 01:13:07
【问题描述】:

这是我的第一个问题:

我希望 PHP 脚本在每个页面上包含加密的用户 ID。然后我将使用 JS 读取它并将其发送到我解码值的 Java 服务器。

我想让它变得安全,这样人们就不会伪造他们的 ID。 (别担心,这不会用于身份验证。)

加密的 ID 可能是 MySQL 的自动递增列 1、2、3.. 我无法更改。

拥有这些属性会很不错:

  • 加密后的 ID 应仅在一天内有效,理想情况下是每秒使用一次
  • 加密的 ID 不应轻易伪造(最好是用户自己伪造)

请随意提出其他类型的解决方案。谢谢!

【问题讨论】:

  • 您真的需要在 Java 中解码 ID,还是只需要它来进行比较/数据库查找?如果您不需要对其进行解码,则哈希可能是一种更直接的方法。
  • 是的,我需要在服务器上对值进行解码。我有一个错字,我说我会用 JavaScript 解码,对不起!
  • 听起来您正在尝试重新实现会话。您是否有任何理由不想为此使用它们?这样一来,您就不必传递 ID,而且其他人也无法在不劫持其他用户会话的情况下轻松伪造它们(HTTPS 很好地解决了这个问题)。
  • 你有什么建议?在我的场景中,客户将我提供的 PHP sn-p 插入到他的脚本中。该 sn-p 在生成的页面上包含我的 JS 并调用我的服务器。这就是我对 PHP 服务器所做的所有更改。

标签: java php encryption


【解决方案1】:

使用安全散列函数对用户 ID 和一些定期更改的值的组合进行散列可能是个好主意。例如,您可以每天选择一个 128 位随机数,然后将 ID 设置为该值与用户 ID 连接的哈希值。假设您使用良好的散列,例如 SHA-256,这在密码学上是安全的。

【讨论】:

  • 我将通过一些修改走这条路,因为对 PHP 服务器没有那种控制权。非常感谢大家!
【解决方案2】:

使用用户 ID 对时间戳进行哈希处理可能是最好的方法,并检查给定时间戳和当前时间戳之间的时间差。不过,您必须确保接受的差异足够大,以考虑任何服务器延迟。

【讨论】:

    【解决方案3】:

    考虑使用数字必须通过才能有效的算法。银行卡、IMEI(手机)等主要使用Luhn算法-http://en.wikipedia.org/wiki/Luhn_algorithm

    【讨论】:

    • 这是一种相当直观的方法,但是这是假设他还没有现有的用户 ID(这肯定只能偶然符合 mod 10 检查)。
    • @jerluc:是的。我假设没有现有的 ID,就好像存在一样,让人们无法伪造它们将非常困难,因为您会假设它们是增量分配的。
    • @hakunin:然后我认为放入一些东西来阻止人们假装它们会很困难。尽管您可以做的一件事是在您现在拥有的 ID 下画一条线,并使用新方法启动新用户或使用新 ID 升级现有用户。在不知道您的设置和规模的情况下,很难说这是否可行。
    • 这可行,但情况并非如此,我可以以任何方式更改 ID 生成或以前的 ID。感谢您提出问题,我也将不得不关注这一点。
    【解决方案4】:

    我想不出任何仅使用 JavaScript 就能安全解密的方法,因为您需要在源代码中包含密码,这不是很安全。

    最好的方法是使用 PHP 加密和解密:您可以在 JavaScript 代码中调用 PHP(使用 AJAX)。

    所以,例如:

    加密.php

    <?php 
        $password = "KEYVALUE"; 
        $secret_text = "USERID HERE"
        $encrypted_text = mcrypt_ecb(MCRYPT_DES, $password, $secret_text, MCRYPT_ENCRYPT); 
        echo $encrypted_text;
    ?>
    

    然后你有一个叫做decrypt.php的东西,它所做的就是接受一个GET参数,唯一的输出是解密的文本(没有HTML代码或任何东西。从技术上讲,你可能应该将XML用于AJAX,但因为它是只有一个值...)

    解密.php

    <?php 
        $password = "KEYVALUE"; 
        $decrypted_text = mcrypt_ecb(MCRYPT_DES, $password, $_GET['decrypt'], MCRYPT_DECRYPT); 
        echo $decrypted_text;
    ?> 
    

    你可以通过调用来测试一下

    decrypt.php?decrypt=encrypted_string

    .

    从这里我会在 JavaScript 中调用“decrypt.php?decrypt=encrypted_string”脚本,然后 JavaScript 可以读取解密后的值。

    可以在这里找到 AJAX 的快速介绍:http://www.yourhtmlsource.com/javascript/ajax.html

    【讨论】:

    • 在 JavaScript 中公开 GET 请求会留下巨大的安全漏洞。如果有恶意的人使用带有加密字符串的查询简单地导航到decrypt.php页面,他/她将能够获得解密后的值。
    • 他说他想混淆。这里没有进行真正的密码学。无论如何都不需要 AJAX。
    • 我的问题有误。我在服务器上对其进行解码,JS 只从 html 中读取并发送过来。对不起,我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多