Wie kann man die installierte Anwendung zur Laufzeit überprüfen, um Phishing-Angriffe zu verhindern?

Ich habe eine Zahlungs-Anwendung in meinem Gerät, meine Anwendung mit dem Dienst der Anwendung zu verbinden, um eine Voraussetzung für die Start-Zahlung Aktivität zu erhalten und dann zu hören, in onActivityResult () -Methode (ähnlich In-App-Purchase-Szenario)

Ich setze den Paketnamen für die Zahlungsabsicht ein. Aber du weißt, es ist keine Garantie Zahlung Anwendung vertraut ist. Wenn manche eine gefälschte Anwendung durch unbekannte Quelle mit demselben Paketnamen und der gleichen Hilfe-Service-Implementierung installieren, dann kann sie mir die Absicht und Phishing meine Benutzer-Info geben.

  • Wie kann ich auf den SMS-Speicher auf Android zugreifen?
  • Kann ich so etwas wie "tooltip" für eine ansicht in android setzen?
  • Android - Integration von ffmpeg und android-ndk-r9c
  • Androide Pop-up-Menüs
  • Wie man ein Datum umwandelt dd / mm / yyyy zu yyyy-MM-dd HH: mm: ss Android
  • Programmieren Sie programmgesteuert zu einer bestimmten Position in einem Android ListView
  • Ich überprüfe Zahlungsergebnis mit irgendeinem Mechanismus und das nur sicher meine Anwendung vom gefälschten Zahlung Resultat aber mein Antrag Benutzer geben ihre Daten in der Phisher-Anwendung ein. (Dieser Absatz sagen, mein Problem ist nicht vertrauenswürdige Antwort der Zahlung Anwendung, mein Problem ist vertrauenswürdige Zahlung Anwendung vor dem Start ihrer Tätigkeit )

    Ich kenne einen Ansatz, dass ich andere Bewerbungsunterschrift und öffentlichen Schlüssel überprüfen kann. Wenn Android OS garantieren, dass der öffentliche Schlüssel und die Signatur schreibgeschützt sind und für die installierte Anwendung übereinstimmen , kann ich mich darauf verlassen und den öffentlichen Schlüssel der Zahlungsanwendung überprüfen, bevor ich die Absicht an die Sendung schicke. Aber ich denke, das ist nicht fertig und überprüfe nur Bei der Installation.

    Irgendwelche Vorschläge (ähnlicher oder anderer Ansatz), um Phishing-Angriffe zu verhindern?

    Aktualisiert : ca. 50% der Applikationsanwendung der Anwendung von meiner Unternehmens-Website direkt (Unknown-Source).

  • Android-Kamera takePicture-Funktion ruft keine Callback-Funktion auf
  • Parse Dynamic Key Json String mit Retrofit
  • Warum bekomme ich falsche requestCode?
  • Das Aufrufen von DialogFragment's show () von innen aufRequestPermissionsResult () verursacht IllegalStateException in Marshmallow
  • Padding funktioniert nicht auf ImageButton
  • Gibt es eine Möglichkeit, einen Material-Stil Schatten in API <21 (5.0 Lolipop)?
  • 3 Solutions collect form web for “Wie kann man die installierte Anwendung zur Laufzeit überprüfen, um Phishing-Angriffe zu verhindern?”

    Android bietet eine native Methode, um zu überprüfen, ob eine App von Play Store installiert wurde, sogar Amazon App Store. Aber funktioniert es an anderen apps?

    Werfen Sie einen Blick auf die Methode:

    PackageManager.getInstallerPackageName(String packageName) (Dokumentation)

    Glücklicherweise für Sie, getInstallerPackageName akzeptiert einen String-Paket-Namen, was bedeutet, dass Sie es die Post-ID Ihrer Nachbar-App-Paket, und haben es den Paket-Namen, die es installiert!

    Dieses Beispiel wird Ihnen sagen, wenn Ihre Nachbar-App wurde von Play Store installiert, aka com.android.vending :

     if(context.getPackageManager().getInstallerPackageName("com.untrusted.app") == "com.android.vending") { // ^^^ CHANGE ^^^ //Verified; app installed directly from Play Store } 

    Amazon App Store hat einen ungeraden Paketnamen:

     if(context.getPackageManager().getInstallerPackageName("com.untrusted.app") == "com.amazon.venezia") { //Verified; app installed directly from Amazon App Store } 

    Das sollte alles sein, was du brauchst, hoffe es hilft!

    Was ist, wenn Haupt-App Signatur der Zahlungs-App über Paket-Manager api und validieren Sie es (von Whitlist von Signaturen, zum Beispiel)? Der Validierungsprozess kann auch im Haupt-App-Server erfolgen.

    EDIT: so etwas

      List<byte[]> whitelist = ... ; // load from config or something... PackageManager pm = this.getPackageManager(); String packageName = "payment.app.package.name"; PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; for (Signature sig : signatures) { InputStream input = new ByteArrayInputStream(sig.toByteArray()); CertificateFactory cf = CertificateFactory.getInstance("X509"); X509Certificate cert = (X509Certificate) cf.generateCertificate(input); PublicKey pb = cert.getPublicKey(); if (! whitelist.contains(pb.getEncoded())) { throw new Exception("public key is not valid"); } } 

    Was Sie suchen, ist eine Kombination von App Signaturen und Berechtigungen. Um zu klären, wird dies nur funktionieren, wenn Sie beide Anwendungen besitzen und können sie mit dem gleichen Schlüssel zu unterzeichnen.

    Nach den docs:

    "Signatur": Eine Erlaubnis, die das System nur gewährt, wenn der anfordernde Antrag mit demselben Zertifikat wie der Antrag, der die Erlaubnis erklärt hat, unterzeichnet wird. Wenn die Zertifikate übereinstimmen, gewährt das System automatisch die Berechtigung, ohne den Benutzer zu benachrichtigen oder um die explizite Genehmigung des Benutzers zu bitten.

    Dies bedeutet, dass das Android OS selbst erzwingt, dass die Signaturen der beiden Anwendungen übereinstimmen müssen, damit die Erlaubnis erteilt werden kann. Dies ist, was Sie wollen, da die Erlaubnis nicht gewährt wird, wenn jemand versucht, Ihre App zu spoof. Da sie ihre App nicht mit Ihrem privaten Schlüssel signieren können, gibt es keinen Weg, wie sie Ihre Unterschrift schmieden können.

    Um eine Erlaubnis zu erstellen, in deinem Manifest für die Anwendung, die den Zahlungsdienst zur Verfügung stellt, solltest du es so erklären:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp.paymentservice" > <permission android:name="com.example.myapp.paymentservice.permission.PAYMENT" android:label="@string/permission_payment_label" android:description="@string/permission_payment_description" android:protectionLevel="signature" /> ... 

    Dann, wenn Sie Ihren Service erklären, schützen Sie es mit dem android:permission , die Sie erklärten:

      ... <service android:name=".BillingService" android:permission="com.example.myapp.paymentservice.permission.PAYMENT" /> </manifest> 

    Schließlich erklären Sie in Ihrer Clientanwendung (en), dass Sie diese Berechtigung verwenden:

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp.clientapp" > <uses-permission android:name="com.example.myapp.paymentservice.permission.PAYMENT" /> ... </manifest> 

    Solange die beiden Anwendungen mit demselben Signaturschlüssel signiert sind, erteilt das Betriebssystem die Berechtigung. Weitere Informationen finden Sie unter http://developer.android.com/guide/topics/security/permissions.html#defining und http://developer.android.com/guide/topics/manifest/permission-element.html

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.