【问题标题】:Security on android volley POST Request at php filephp文件中android volley POST请求的安全性
【发布时间】:2018-08-22 07:21:43
【问题描述】:

我有一个处理货币交易的应用程序,因此安全性非常重要。当用户向我的 php 文件发送请求时,我使用密码和其他一些技巧,但我想知道是否有可能让 php 文件验证 POST 方法仅从我的应用程序和 Volley 发送?

我不想接受来自网页或其他任何东西的请求;只有我对 Android Volley 的请求才会继续。

P.S : 从 POST 方法发送值并检查 PHP 以识别不是安全方法,并且很容易被黑客入侵。

【问题讨论】:

  • 您能否重新编写您的问题并尝试使其更清楚,您想确保数据来自您的应用程序?
  • @Mehdi 是的,兄弟,这正是我的问题

标签: php android security android-volley


【解决方案1】:

当您从 android 发送请求时,使用某种加密(可能是 RSA)加密您的有效负载,然后在您的服务器端解密该请求,如果解密成功,您可以确定该请求是真实的并且没有被更改。

在 PHP 中生成私钥文件

$config = array(
   "digest_alg" => "sha512",
   "private_key_bits" => 4096,
   "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$keys = openssl_pkey_new($config);
$priv = openssl_pkey_get_private($keys);
openssl_pkey_export_to_file($priv, 'private.pem');

使用 OpenSSL 从私钥文件生成公共 .der 文件

openssl rsa -in private.pem -pubout -outform DER -out public.der

在Java(Android端)中导入和使用公钥:

File pubKeyFile = new File("public.der");
DataInputStream dis = new DataInputStream(new FileInputStream(pubKeyFile));
byte[] keyBytes = new byte[(int) pubKeyFile.length()];

dis.readFully(keyBytes);
dis.close();

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic(keySpec);

在 Android 中编码您的有效负载(根据您的要求获取字节)

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
String payload = "tejashwi kalp taru";
byte[] encryptedBytes = Base64.getEncoder().encode(cipher.doFinal(payload.getBytes()));
String encryptedData = new String(encryptedBytes));
//send encryptedData to server for decryption

用 PHP 解密你的有效载荷:

$fp = fopen("private.pem", "r");
$privateKey = fread($fp, 8192);
fclose($fp);

$res = openssl_get_privatekey($privateKey);
$cipher = base64_decode($cipher);
openssl_private_decrypt( $cipher, $decrypted, $res, OPENSSL_PKCS1_OAEP_PADDING );

// $decrypted is the result

用于演示的 Git 代码库:https://github.com/tejashwikalptaru/encrypted-communication

【讨论】:

  • 你在php的最后一部分没有使用加密文本,我应该把加密文本放在哪里解密?
  • $cipher 是您从安卓设​​备发送的加密文本
  • @ali22 我添加了一个 git repo,检查一下
  • 我应该将 public.der 文件放在我的包中的哪个位置?
  • 把它放在你的资产文件夹中,然后从那里读取。看到这个stackoverflow.com/a/38121187/2520628
【解决方案2】:

一般来说,不会。做不到。无论您的应用做什么,有人可以在不使用您的应用的情况下做同样的事情。

不过,您可能难以复制应用的功能。正如已经建议的那样,使用加密可以实现这一点:攻击者必须从您的应用中提取密钥并复制您的加密逻辑。

类似地,您可以设置自定义标头,您可以检查其他标头是否与您的应用发送的内容相匹配,您可以检查有效负载的详细信息以查看它们是否与应用发送的内容相匹配,等等。任何这些都使得构建一个合法的请求变得更加困难,但没有一个可以阻止它。

但可以阻止一些攻击向量:例如,如果您特别想阻止来自未经修改的 Web 浏览器的请求,您可以检查无法从 Javascript 设置的标头:https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2021-10-15
    相关资源
    最近更新 更多