我有一个非常简单(相当愚蠢)的问题,我希望有人可以清楚我的想法:)
我想在点击按钮后向我的网站用户发送电子邮件。此电子邮件将包含链接URL中用户的userID链接(作为链接的查询参数)。
用户点击此电子邮件链接后,我的服务器端代码将解析并解密userID查询字符串键以获取用户ID并对其执行某些操作。
我无法使用base64编码,因为它可以被反转,'黑客'可以了解真正的用户ID。我必须加密ID,但是当我使用AES算法进行加密时,浏览器无法理解加密文本,即我无法将加密的userId文本作为URL的一部分传递,因为它包含未编码的字符,如浏览器无法通过的“/”。我能想到的一个选择是在通过URL发送加密文本后对其进行base64编码。然后我可以beas64解码并解密它。
这种方法比在encyrpted文本上使用Uri.EscapeDataString()更好吗?
答案 0 :(得分:3)
使用SHA1或MD5之类的单向哈希,并使用JavaScript将值作为加密值发送。然后,如果黑客拦截请求,他们将只有哈希而不是实际值。但他们仍然可以发送哈希登录;一种解决方案是包含基于IP的JavaScript参数(通过服务器端语言生成)(但黑客无法找到公式),并使用它来加密用户名和密码哈希值。
然后在服务器端你会做(在PHP中,在这种情况下):
$ipHash = sha1("random" . $_SERVER['REMOTE_ADDR'] . "salt_here10381") // place this as a hidden element in the form and use it in the JavaScript to calculate the hash
$userHash = $_POST['userHash'];
$passwordHash = $_POST['passwordHash']
// TODO: Escape $ipHash, $userHash, $passwordHash
$results = mysqli->query("SELECT * FROM `users` WHERE SHA1(CONCAT('" . $ipHash . "', `user`)) ='$userHash' AND SHA1(CONCAT('" . $ipHash . "', `password`)) = " '$passwordHash'");
然后,如果黑客想要使用他们找到的哈希和用户名登录,他们将需要与最初登录其用户截获的用户相同的IP。
请注意,这假设您将密码存储在数据库中作为纯文本,您绝不应该这样做。
对于使用SHA1进行散列,在客户端,请查看this。
要回答你的具体问题(我看到我有点偏离主题,哎呀,)当你将它们发送到服务器时,对它进行base64编码是可以接受的。如果可能,尝试将其作为POST数据发送,并将其保存在cookie或会话变量中。
答案 1 :(得分:2)
您应该继续对AES数据进行base64编码,因为此时它可能是二进制而不是可以转义的字符串。您还应该检查是否使用了url safe base64编码。
答案 2 :(得分:0)
我想到一个简单的解决方案,你试图生成一个随机数(使其成为一个键),并为加密使用一些简单的技术,如XOR'用户名中的字符的ASCII值与键您生成的.so长随机密钥会产生更大的结果。
答案 3 :(得分:0)
创建电子邮件时,您需要加密用户ID,然后base64对其进行编码,然后对其进行URL编码。将其作为链接中的userID参数。
在解密电子邮件时,你会反过来做同样的事情。获取userID参数,URL解码,base64解码然后解密。
每次编码用户ID时,请记住使用不同的初始化矢量。您需要将初始化向量作为URL参数放在电子邮件链接中,以便对其进行解密。