【问题标题】:Securing webservices of PHP保护 PHP 的 Web 服务
【发布时间】:2013-10-19 12:22:06
【问题描述】:

我正在使用 php webservices 调用的 android 开发一个小项目。

我希望我的网络服务受到保护,但是通过使用 GET/POST 请求方法,我认为它并没有受到太多保护。谷歌搜索后,我在“phpseclib”中得到了 RSA 实现,它也有很好的文档。但是我很困惑,所以想在这里发布。

基本上我需要的是:

  1. 来自 Android 我将调用一个带有“加密参数合并在一个字符串中”的 url。 (我会先在 json 中编码参数,然后再加密)。
  2. 我将在 php 中提取的那些参数,并进行相应的处理。

json 字符串: {user_id:xyz@gmail.com, passwd: Password!}

加密到: XsjkhkjwehrkanmNXmnskjawrhjlljahdhuw

例如。 http://my.domain.com/webservices/call.php?params=Xsjkhkjwehrkanm,NXmnskjawrhjlljahdhuw 在 php 中,我将从 $_GET['params"'] 中提取用户 ID 和密码

这在 base64_encode(), base64_decode(), 中是可能的,但 base64 编码器只会混淆字符串,实际上不会加密。

我需要公钥/私钥机制。

但是我已经尝试过了:(https://launchkey.com/docs/api/encryption/php/phpseclib)

<?
function rsa_encrypt($key, $message) {
    $rsa = new Crypt_RSA(); 
    $rsa->loadKey($key); 
    $encrypted = base64_encode($rsa->encrypt($message)); 
    return $encrypted;
}
?>

它没有返回任何 $encrypted 字符串。

任何帮助将不胜感激。

谢谢..! :)

【问题讨论】:

  • 嘿,你为什么不在所有网站之上实施 SSL/TLS?
  • 关于在 GET 请求中传递密码,我不推荐它,使用 POST,然后探索只有您的应用程序和 API 知道的密码参数的散列和加盐。这将使请求更加安全。涉及密码的地方总是使用 HTTPS、散列和盐。但是,当您只是传递查询时,可能是在一个宁静的庄园中,我目前使用一种技术,其中查询字符串中有许多参数和值,然后所有这些都在签名参数中进行散列和加盐处理。然后您可以在 api 端对此进行解码并防止篡改...

标签: php android web-services encryption phpseclib


【解决方案1】:

如果您不熟悉加密,您应该按照 cmets 中的建议走简单的路线并使用 HTTPS。

另外,正如 cmets 中所建议的,不要通过 GET 从网页发送密码,因为它会显示在地址栏中,路人可以从屏幕上读取。

HTTPS (SSL/TLS) 为 Web 服务器和客户端之间的整个连接提供端到端加密。这使您可以以明文形式发送所有数据而不必担心,因为它是在较低级别进行加密的。

由于调用您的网络服务器的不是网络浏览器,您甚至不需要为 SSL 证书付费。您可以创建自签名证书。只需确保您验证每个连接上的签名,以防止中间人攻击。不过这有点棘手,所以再次强调,如果您是新手,只需支付 SSL 证书,让 Android 为您处理证书验证。

回答您的直接问题:

您可能已经发现,编码不是加密。 Base64 是编码,不提供安全性。

您不能简单地生成 RSA 公钥/私钥对,使用私钥加密数据,然后将其发送到您的服务器。您必须首先与服务器共享您的公钥。好吧,任何从网络上嗅出公钥的人都可以解密它。

您可以让客户端生成一个随机对称密钥并使用服务器的公钥对其进行加密。然后,服务器将使用私钥对其进行解密,并拥有一个共享密钥用于加密数据并将其发送给您。

问题在于攻击者可以简单地将您的所有数据重播到服务器以查看相同的输出。这些随机的东西需要由服务器生成以确保它们实际上是随机的,所以你被服务器生成密钥卡住了,但如果服务器只是用私钥加密,任何拥有公钥的人都可以解密它。

因此,您需要某种安全导出共享密钥的方法,一种共享某些数据的复杂数学方法,服务器和客户端都可以使用这些数据来计算相同的共享密钥。

您可以自己执行此操作,但您将调用复杂的过程和函数,而您可以只使用 SSL,它为您做同样的事情。

【讨论】:

    【解决方案2】:

    我认为您可以使用 POST 网络服务使其更安全,如果可能的话,请不要加密参数,只需加密参数的值,然后如果您遇到问题,请尝试使用检索值

    $_REQUEST['parameter_name']

    【讨论】:

    • 好吧,它可以工作,但问题是 POST 不会保护数据,它只会对普通用户隐藏,专家用户仍然可以使用一些数据包嗅探器获取 POST 数据。谢谢.. :)
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多