Das Android-Betriebssystem verfügt über zahlreiche integrierte Sicherheitsfunktionen, z. B. Anwendungs-Sandboxing, Schutz vor Puffer- und Ganzzahlüberlaufangriffen sowie getrennte Speicherbereiche für Programmanweisungen und Daten. Daher können einfache Android-Apps, die keine Dateisysteme oder Netzwerkvorgänge ausführen, häufig als sicher eingestuft werden.
Wenn Sie eine komplexere App entwickeln, ist es jedoch Ihre Aufgabe, diese zu schützen und die Privatsphäre Ihrer Nutzer zu schützen. In diesem Artikel werde ich einige der bewährten Vorgehensweisen auflisten, mit denen Sie eine sichere Android-App erstellen können, die keine Daten oder Berechtigungen verliert und im Allgemeinen weniger anfällig für bösartige Apps ist, die möglicherweise auf dem Computer installiert sind Benutzergerät.
Jeder Android-App ist ein internes Speicherverzeichnis zugeordnet, dessen Pfad auf dem Paketnamen der App basiert. Dateien in diesem Verzeichnis sind sehr sicher, da sie die MODE_PRIVATE
Dateierstellungsmodus standardmäßig. Dies bedeutet, dass auf die Dateien keine andere App auf dem Gerät zugreifen kann. Daher ist es am besten, alle vertraulichen Daten Ihrer App im internen Speicherverzeichnis zu speichern.
Um den absoluten Pfad des internen Speicherverzeichnisses Ihrer App zu ermitteln, wird empfohlen, das getFilesDir ()
Methode. Wenn Sie den Pfad kennen, können Sie auf die darin enthaltenen Dateien so einfach zugreifen wie auf Dateien in einem anderen Verzeichnis. So können Sie beispielsweise auf eine aufgerufene Datei verweisen myfile.dat im internen Ablageverzeichnis Ihrer App:
Datei myFile = neue Datei (getFilesDir (), "myfile.dat");
Die interne Speicherkapazität eines Android-Geräts ist häufig begrenzt. Daher haben Sie manchmal keine andere Wahl, als vertrauliche Daten auf externen Speichermedien zu speichern, beispielsweise auf einer auswechselbaren SD-Karte.
Da Benutzer und andere Apps auf dem Gerät direkt auf Daten auf externen Speichermedien zugreifen können, ist es wichtig, dass Sie sie in einem verschlüsselten Format speichern. Einer der populärsten Verschlüsselungsalgorithmen, der heute von Entwicklern verwendet wird, ist AES (kurz: AES) fortgeschrittener Verschlüsselungsstandard, mit einer Schlüsselgröße von 256 Bit.
Schreiben von Code zum Verschlüsseln und Entschlüsseln der Daten Ihrer App mithilfe von javax.crypto
Paket, das im Android SDK enthalten ist, kann verwirrend sein. Daher bevorzugen die meisten Entwickler Bibliotheken von Drittanbietern, z. B. die Conceal-Bibliothek von Facebook, mit der normalerweise viel einfacher zu arbeiten ist.
Erfahrene Programmierer, die mit der Android-Anwendungsentwicklung noch nicht vertraut sind, versuchen häufig, Sockets, Named Pipes oder freigegebene Dateien zu verwenden, um asynchron mit anderen auf einem Android-Gerät installierten Apps zu kommunizieren. Diese Ansätze sind nicht nur hart und unelegant, sondern auch anfällig für Bedrohungen. Eine einfachere und sicherere Methode zur Kommunikation zwischen Prozessen auf dem Android-Betriebssystem ist die Verwendung von Intentionen.
Um Daten an eine bestimmte Komponente einer App zu senden, müssen Sie eine neue Instanz von erstellen Absicht
Klasse und verwenden Sie seine setComponent ()
Methode, um sowohl den Paketnamen der App als auch den Namen der Komponente anzugeben. Sie können dann Daten mit dem hinzufügen putExtra ()
Methode.
So können Sie beispielsweise die Zeichenfolge senden Hallo Welt zu einem Aktivität
namens Meine Aktivität, Das gehört zu einer App, deren Paketname lautet my.other.app:
// Eine Absicht erstellen Absicht Absicht = neue Absicht (); // Geben Sie den Namen der Komponente an. Intent.setComponent (neuer Komponentenname ("my.other.app", "my.other.app.MyActivity")); // Daten hinzufügen intent.putExtra ("DATA", "Hello World!"); // Sende die Absicht zur Aktivität startActivity (Absicht);
Um Daten gleichzeitig an mehrere Apps zu senden, können Sie die Absicht als Broadcast mit der sendBroadcast ()
Methode. Standardmäßig kann ein Broadcast jedoch von jeder App gelesen werden, die über eine entsprechende Konfiguration verfügt Rundfunkempfänger
.
Wenn Sie vertrauliche Informationen als Broadcast senden möchten, müssen Sie daher eine benutzerdefinierte Berechtigung verwenden, deren Schutzlevel
ist eingestellt auf Unterschrift
. Auf diese Weise stellt das Android-Betriebssystem sicher, dass nur Broadcasts empfangen werden können, die mit Ihrem Signaturschlüssel signiert wurden.
Hier ist ein Codeausschnitt, der Ihnen zeigt, wie Sie die Zeichenfolge senden Hallo Welt als sichere Sendung:
// Eine Absicht erstellen Absicht Absicht = neue Absicht (); // Daten hinzufügen intent.putExtra ("DATA", "Hello World"); // Geben Sie einen Aktionsnamen für // den Intentfilter des Empfängers ein. Intent.setAction ("my.app.receive"); // Mit einer benutzerdefinierten Berechtigung als Broadcast senden sendBroadcast (intent, "my.custom.permission");
Beachten Sie, dass der obige Code nur wie erwartet funktioniert, wenn die benutzerdefinierte Berechtigung in den Manifestdateien der Sender- und Empfänger-Apps deklariert und verwendet wird.
Die gesamte Kommunikation zwischen Ihrer App und Ihren Servern muss über eine HTTPS-Verbindung erfolgen, vorzugsweise über die HttpsURLConnection
Klasse. Wenn Sie denken, dass die Verwendung von HTTP für nicht vertrauliche Daten in Ordnung ist, denken Sie noch einmal darüber nach.
Viele Android-Benutzer verbinden sich täglich mit mehreren offenen WLAN-Hotspots in öffentlichen Bereichen. Einige dieser Hotspots können bösartig sein. Ein schädlicher Hotspot kann leicht den Inhalt des HTTP-Datenverkehrs ändern, sodass sich Ihre App auf unerwartete Weise verhält, oder schlimmer noch, Anzeigen oder Exploits einschleusen.
Durch die Verwendung von HTTPS können Sie, solange der Server mit einem von einer vertrauenswürdigen Zertifizierungsstelle (z. B. DigiCert oder GlobalSign) ausgestellten Zertifikat konfiguriert ist, sicher sein, dass Ihr Netzwerkverkehr vor Abhörangriffen und Man-in-the-Middle-Angriffen geschützt ist.
Wenn Ihre App über viel Netzwerkcode verfügt und Sie befürchten, dass Sie unwissentlich Daten als Klartext senden, sollten Sie Nogotofail, ein von Google entwickeltes Open-Source-Tool, verwenden, um solche Fehler zu finden.
Damals, als GCM, kurz für Google Cloud Messaging, nicht existierte, nutzten viele Entwickler SMS, um Daten von ihren Servern in ihre Apps zu pushen. Heute ist diese Praxis weitgehend vorbei.
Wenn Sie zu den Entwicklern gehören, die noch nicht von SMS zu GCM gewechselt haben, müssen Sie wissen, dass das SMS-Protokoll weder verschlüsselt noch vor Angriffen durch Spoofing geschützt ist. Darüber hinaus kann eine SMS von jeder App auf dem Gerät des Benutzers gelesen werden, auf der die READ_SMS
Genehmigung.
GCM ist viel sicherer und die bevorzugte Methode, um Nachrichten an eine App zu senden, da alle GCM-Kommunikationen verschlüsselt sind. Sie werden mit regelmäßig aktualisierten Registrierungstoken auf der Clientseite und einem eindeutigen API-Schlüssel auf der Serverseite authentifiziert. Weitere Informationen zu GCM finden Sie in diesem Lernprogramm zu Push-Benachrichtigungen.
Der Privatsphäre der Benutzer wird heutzutage viel Bedeutung beigemessen. In der Tat gibt es Gesetze wie die Datenschutzrichtlinie der Europäischen Union und das Gesetz über den Schutz personenbezogener Daten und elektronische Dokumente in Kanada, die den Schutz der Privatsphäre eines Nutzers vorschreiben. Wenn Sie keinen Grund und eine sehr sichere Infrastruktur haben, um persönliche Benutzerinformationen zu sammeln, zu speichern und zu übertragen, müssen Sie es daher vermeiden, direkt in Ihren Apps danach zu fragen.
Ein besserer Ansatz für die Benutzerauthentifizierung und das Auffinden von Benutzerprofilen auf Android ist die Google Identity Platform. Mit der Google Identity-Plattform können sich Benutzer mit ihrem Google-Konto schnell bei Ihrer App anmelden. Nach einer erfolgreichen Anmeldung über die Plattform kann Ihre App bei Bedarf problemlos verschiedene Details zum Benutzer abrufen, z. B. den Namen des Benutzers, die E-Mail-Adresse, das Profilfoto, Kontakte und vieles mehr. Alternativ können Sie kostenlose Dienste wie Firebase verwenden, mit denen Sie die Benutzerauthentifizierung verwalten können.
Wenn Sie Benutzeranmeldeinformationen selbst behandeln müssen, wird empfohlen, diese in Form sicherer Hashes zu speichern und zu übertragen. Der einfachste Weg, verschiedene Arten von Hashes mit dem Android SDK zu generieren, ist die Verwendung von MessageDigest
Klasse.
Hier ist ein kleiner Code-Ausschnitt, der zeigt, wie man einen Hash der Zeichenkette erstellt Hallo Welt Verwenden der SHA-256-Hashfunktion:
// MessageDigest für die Verwendung von SHA-256 initialisieren MessageDigest md = MessageDigest.getInstance ("SHA-256"); // Konvertiere den String in ein Hash-Byte [] sha256Hash = md.digest ("Hello World" .getBytes ());
Unter Android führen ungültige Benutzereingaben normalerweise nicht zu Sicherheitsproblemen wie Pufferüberschreitungen. Wenn Sie jedoch Benutzern erlauben, mit einer SQLite-Datenbank oder einem Inhaltsanbieter zu interagieren, der intern eine SQLite-Datenbank verwendet, müssen Sie die Benutzereingaben entweder streng bereinigen oder parametrisierte Abfragen verwenden. Andernfalls werden Ihre Daten für SQL-Injection-Angriffe anfällig.
In ähnlicher Weise ist die Validierung und Bereinigung von Benutzereingaben auch sehr wichtig, wenn Sie Benutzereingaben verwenden, um Code dynamisch zu generieren, um auf einem eingebetteten Skriptmodul wie Mozilla Rhino ausgeführt zu werden.
In eine Android-App integrierte Sicherheitsmaßnahmen können stark beeinträchtigt werden, wenn Angreifer den Quellcode in die Hände bekommen. Bevor Sie Ihre App veröffentlichen, wird empfohlen, ein Tool namens ProGuard zu verwenden, das im Android-SDK enthalten ist, um den Quellcode zu verschleiern und zu minimieren.
Android Studio schließt ProGuard automatisch in den Build-Prozess ein, wenn die buildType
ist eingestellt auf Veröffentlichung
. Die Standard-ProGuard-Konfiguration, die im Android-SDK verfügbar ist proguard-android.txt Die Datei reicht für die meisten Apps aus. Wenn Sie der Konfiguration benutzerdefinierte Regeln hinzufügen möchten, können Sie dies in einer Datei namens tun proguard-rules.pro, Dies ist ein Teil jedes Android Studio-Projekts.
Ich hoffe, Sie haben jetzt ein besseres Verständnis dafür, wie Sie Ihre Android-Apps sicherer machen. Die meisten der in diesem Artikel erwähnten Best Practices gelten nur, wenn Sie das Android SDK zum Entwickeln Ihrer Apps verwenden. Wenn Sie stattdessen Android NDK verwenden, müssen Sie viel vorsichtiger sein, da bei der Programmierung in der Programmiersprache C von Ihnen erwartet wird, dass Sie auf niedriger Ebene Details wie Zeiger und Speicherzuordnung selbst verwalten.
Weitere Informationen zur Sicherheit unter Android finden Sie in den AOSP-Sicherheitsdokumenten.