我正在创建一个与Web服务器上的PHP脚本通信的程序,为此我需要能够将参数从程序传递到PHP脚本。
现在这是我的问题。在某些时候,需要将用户名和密码传递给脚本。现在这不是以一种对用户来说很明显的方式(例如在地址栏中)完成的,但我知道对某人真的想要解决它的问题有点嗤之以鼻。因此,虽然我的脚本可以安全地注入,但显然可变篡改是一个问题。
这是我提出的一个想法,所以请帮助我绕过它,看看这是否会像我想的那样发挥作用。
我的想法是在发送之前在客户端加密用户密码(或其他唯一密钥)变量,这样你就会得到一个像(显然只是编造)mypage.php的网址?un = Oa348uty8& ps = op986hGTfreu然后当它获取PHP脚本解密并使用不同的盐再次加密。
因此,当它离开应用程序时,它将被加密但不是正确的方式,然后当它命中PHP脚本服务器端解密它并使用正确的盐重新加密它,这样它将正确匹配存储的加密密码。
这样,他们的用户就不会知道他们的密码的加密版本应该是什么样子,所以如果不这样,他们将无法篡改URL并尝试插入假值。
答案 0 :(得分:1)
简而言之,您正在考虑这个问题:
在服务器端,你有:
你的问题:
当您的本地应用程序在服务器端调用php脚本时,2个参数以纯文本形式给出。并且你想要避免篡改(如果你的脚本是安全的注入我只看到篡改用于强制认证< =请记住我会在整个帖子中保留这个假设)
您的解决方案:
我的想法:
这不会解决篡改问题,有人仍然可以伪造请求。 第一次加密是无用的,因为有人可以检索客户端使用的密钥。 第二次加密并不安全,因为您为所有用户使用相同的盐。
我建议:
如果您不使用HTTPS等安全协议(可以使用SSL或TLS),则接受无法避免篡改。 如果你想要一个没有HTTPS的可接受的安全性,我将实现以下内容:
改进之处在于攻击者必须尝试连续强制使用两个sha1密码,并且必须提供有效的令牌来执行登录操作。另外,如果你使用变量均匀长度的十六进制字符作为一个字符串使用盐,它将使攻击者更难以识别第二个散列强制执行的值是一个sha1散列,即使他知道这是一个sha1他将不得不测试多个案例,以尝试找到与哈希对应的值的正确部分。
由于变量salt,如果散列,相同的密码将不相同: 想象一下,攻击者嗅到一个哈希并知道使用了哪个密码,然后嗅到用另一个密码制作的另一个哈希,攻击者将无法知道2密码在哪里相同(有点矫枉过正但仍然有用) )。
将密码存储为散列值更安全,因为如果攻击者设法转储您的用户表,他将无法立即使用密码,他将不得不强制执行每个密码。 最后sha1哈希比md5更安全(我告诉你,因为你在帖子中使用了md5标签)
此方法的缺点是密码无法撤消,因此如果用户丢失密码,您将无法将密码退回给用户。你必须让他们设置一个新的。
一种硬核方式(仍未使用HTTPS),将使用强密码(如AES或3DES)加密您的密码和用户名,并使用安全密钥交换算法(如Diffie Hellman之一)进行交换随机共享密钥。
此方法不会阻止篡改,但会阻止攻击者,因为他无法解密该值(假设他只是在嗅探网络)。密钥是随机的,永远不会在您的任何应用程序中进行硬编码,因此即使有人撤销您的客户端,他也无法检索密钥。 我仍然建议你存储你的密码值有哈希。
一种极端的方式是合并两种方法,但是完全过度。
希望这会给你一些想法
答案 1 :(得分:0)
您的方法的问题不在于您是否在URL中使用加密的密码和用户名。如果用户通过向您发送加密字符串进行身份验证,那么我作为攻击者仍然可以嗅出这些哈希值,将它们传递给您的应用程序并进行身份验证。除非这样,你事先做了一些公钥/私钥交换,但这只是重新实现HTTPS,所以你也可以只使用HTTPS。
您应该做的是使用POST通过HTTPS发送请求。
答案 2 :(得分:0)
使用Javascript从客户端加密到服务器只能防止非SSL发布失败。 我认为你必须使用sessions而不是这种类型的加密。
答案 3 :(得分:0)
更新: 您可以在两个脚本中添加自己的密钥。