如何在运行时验证已安装的应用程序以防止网络钓鱼攻击?

Moj*_*Asg 11 security android phishing android-intent

我的设备中有一个支付应用程序,我的应用程序连接到该应用程序的服务以获取启动支付活动的待处理意图,然后在onActivityResult()方法中监听结果.(类似于应用内购买方案)

我为付款意图设置了包裹名称.但是你知道,这并不能保证支付应用程序是值得信赖的.如果有人通过具有相同包名称和相同的aidl-service实现的未知来源安装假应用程序,那么它可以给我挂起意图和网络钓鱼我的用户信息.

我通过某种机制验证付款结果,并且只保证我的应用程序免于虚假付款,但我的应用程序用户在网络钓鱼者应用程序中输入他们的数据.(这一段说我的问题不信任支付应用程序的响应,我的问题是在启动他们的活动之前信任支付应用程序)

我知道一些方法,我可以检查其他应用程序签名和公钥.如果 Android操作系统保证公钥和签名是只读的并且与已安装的应用程序匹配,我可以依赖它并在发送意图之前检查支付应用程序的公钥.但我猜这些不是现成的,只检查匹配在安装.

防止网络钓鱼攻击的任何建议(类似或不同的方法)?

更新:直接从我的公司网站(Unknown-Source)约50%的应用程序用户安装应用程序.

Aar*_*ion 5

Android提供了一种本机方法来验证是否已从Play商店,甚至亚马逊应用商店安装了应用.但它是否适用于其他应用程序?

看一下方法:

PackageManager.getInstallerPackageName(String packageName) (文档)

幸运的是,您getInstallerPackageName接受一个String包名称,这意味着您可以将它提供给您的邻居应用程序包ID,并让它返回安装它的包名称!

此示例将告诉您邻居应用程序是否由Play商店安装,也就是com.android.vending:

if(context.getPackageManager().getInstallerPackageName("com.untrusted.app") ==
  "com.android.vending") {                          //   ^^^ CHANGE ^^^

  //Verified; app installed directly from Play Store
}
Run Code Online (Sandbox Code Playgroud)

亚马逊应用商店有一个奇怪的包名称:

if(context.getPackageManager().getInstallerPackageName("com.untrusted.app") ==
  "com.amazon.venezia") {

  //Verified; app installed directly from Amazon App Store
}
Run Code Online (Sandbox Code Playgroud)

这应该是你需要的一切,希望它有所帮助!