PHP和Java中短字符串的安全加密

PHP和Java中短字符串的安全加密,java,php,encryption,Java,Php,Encryption,这是我的第一个问题: 我希望PHP脚本在每个页面上都包含加密的用户ID。然后我将使用JS读取它,并将其发送到Java服务器,在那里我解码该值 我想让它更安全,这样人们就不会伪造身份证了。(别担心,这不会用于身份验证。) 加密的ID可能是MySQL的自动递增列1,2,3。。我无法改变这一点 拥有这些属性会很好: 加密的ID应该只在一天内有效,最好是一次/秒 加密的ID不应轻易伪造(理想情况下,即使是用户自己也不应伪造) 请随意提出其他类型的解决方案。谢谢 考虑使用一种算法,数字必须通过才能有效

这是我的第一个问题:

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

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

加密的ID可能是MySQL的自动递增列1,2,3。。我无法改变这一点

拥有这些属性会很好:

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

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

考虑使用一种算法,数字必须通过才能有效。银行卡、IMEI(移动电话)和其他一些主要的银行卡使用Luhn算法-

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

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

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

例如:

encrypt.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代码或任何东西。从技术上讲,您可能应该为AJAX使用XML,但因为它只有一个值…)

decrypt.php

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

您可以通过调用

decrypt.php?decrypt=加密的字符串

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


这里可以找到对AJAX的快速介绍:。

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

您真的需要用Java解码ID,还是只需要它进行比较/DB查找?如果不需要解码,哈希可能是一种更直接的方法。是的,我需要在服务器上解码。我有一个打字错误,我说我会用JavaScript解码,对此我很抱歉!听起来好像您正在尝试重新实现会话。你有什么理由不想用它们来做这个吗?这样你就不必到处传递ID,其他人也不可能轻易伪造它们而不劫持另一个用户的会话(HTTPS很好地解决了这个问题)。你有什么建议?在我的场景中,客户将我提供的一个PHP代码片段插入到他的脚本中。该代码段在生成的页面上包含my JS并调用my server。这就是我对PHP服务器所做的所有更改。这是一个相当直观的方法,不过这是假设他还没有现有的用户ID(这肯定只是碰巧符合mod 10检查)。@jerluc:True。我假设没有现有的ID,如果有,那么让人们无法伪造它们将是极其困难的,就像你假设它们是递增分配的一样。@hakunin:那么我认为采取措施阻止人们伪造它们将是非常困难的。尽管您可以做的一件事是在现有的ID下划一条线,并使用新方法启动新用户,或使用新ID升级现有用户。在不知道您的设置和规模的情况下,很难说这是否可行。这会起作用,但不是这样,我可以以任何方式更改ID生成或以前的ID。谢谢你把这个问题提出来,我也必须关注这个问题。在JavaScript中公开GET请求会留下一个巨大的安全漏洞。如果有人恶意使用带有加密字符串的查询导航到decrypt.php页面,他/她将能够获得解密值。他说他想混淆。这里没有真正的加密技术。根本不需要AJAX。我的问题有一个输入错误。我在服务器上解码,JS只从html中读取并发送过来。很抱歉,我的错。我将对这条路径进行一些修改,因为我无法控制PHP服务器。非常感谢大家!