我有一个处理货币交易的应用程序,因此拥有安全性非常重要。当用户向我的php文件发送请求时,我会使用密码和其他技巧,但是我想知道是否可以通过某种方式让php文件验证POST方法仅从我的应用程序和Volley发送吗?
我不想接受来自网页或其他任何内容的请求;只有我的请求才能进行Android Volley。
P.S:从POST方法发送值并检查PHP以确认这不是安全方法,并且很容易被黑。
答案 0 :(得分:0)
当您从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
答案 1 :(得分:0)
通常,不会。不能做无论您的应用程序执行什么操作,某人都可以执行完全相同的操作而无需使用您的应用程序。
不过,您可能很难复制您的应用程序执行的操作。正如已经建议的那样,使用加密可以达到这一目的:攻击者必须从您的应用程序中提取密钥并复制您的加密逻辑。
同样,您可以设置自定义标头,可以检查其他标头是否与应用程序发送的内容匹配,可以检查有效负载的详细信息以查看它们是否与应用程序发送的内容匹配,依此类推。这些都使构建一个合法通过的请求变得更加困难,但是没有一个阻止它。
不过,可以防止某些攻击媒介:例如,如果您特别想阻止未经修改的Web浏览器发出的请求,则可以检查无法通过Javascript设置的标头:https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name