Sicherheit im Google-Stil



Google I / O 2019 ist abgestorben und es ist Zeit Projekte auf einer neuen Architektur umschreiben neue Dinge lernen. Da ich mich für die Sicherheit mobiler Anwendungen interessiere, habe ich zunächst auf die neue Bibliothek der JetPack-Familie aufmerksam gemacht - Sicherheitskrypto . Die Bibliothek hilft bei der korrekten Organisation der Datenverschlüsselung und schützt Entwickler gleichzeitig vor allen Nuancen, die mit diesem Prozess einhergehen.


Historischer Hintergrund


Die Datenverschlüsselung in Android hat immer viele Diskussionen ausgelöst. Welchen Algorithmus soll man wählen? Welcher Verschlüsselungsmodus soll verwendet werden? Was ist Polsterung? Wo Schlüssel aufbewahren? All dies zu lernen und Ihr Wissen auf dem neuesten Stand zu halten, kann für den durchschnittlichen Entwickler schwierig sein. Daher endete die Geschichte am häufigsten in einem von drei Szenarien:


  • Kopieren-Einfügen der ersten Lösung mit Stackoverflow
  • Suche nach einem „geeigneten Handbuch“ mit anschließender Implementierung und Sammlung von Rechen
  • Aktivierung des Protokolls „Und so wird es auch!“

Als sich die Community der Android-Entwickler entwickelte, tauchten Bibliotheken auf, um dieses Problem zu lösen. Die Qualität dieser Lösungen war sehr unterschiedlich: Aus all dieser Vielfalt kann ich nur Java-Aes-Crypto auswählen, das wir in Redmadrobot verwendet haben. Eine ziemlich hochwertige Implementierung, aber es gab ein paar Probleme damit.


Zunächst war es nur eine String-Verschlüsselung. Dies ist an sich nicht schlecht, aber diese Zeichenfolgen müssen irgendwo in der Datenbank oder in SharedPreferences gespeichert werden. Sie müssen also einen Wrapper über die Datenquelle schreiben, damit alles im laufenden Betrieb verschlüsselt wird (was wir einmal getan haben). Dies ist jedoch der Code, der unterstützt, von Projekt zu Projekt gezogen oder zur einfacheren Verwendung in einer Bibliothek ausgeführt werden muss. Letztendlich wurde dies auch getan, aber es brachte den forschenden Köpfen keinen Trost.


Zweitens bot diese Lösung nichts zur Lösung des Schlüsselverwaltungsproblems. Sie konnten generiert werden, aber der Speicher fiel vollständig auf die Schultern des Entwicklers. Mit all den Kniebeugen rund um AndroidKeystore auf verschiedenen Betriebssystemversionen und Geräten aus Festlandchina.


Diese Stadt braucht einen neuen Helden


Alles lief wie gewohnt, bis ich im Sommer 2018 entdeckte, dass es eine so wunderbare Bibliothek von Google wie Tink gibt . Es ist recht einfach zu erlernen und schützt den Entwickler vor einer Vielzahl von Nuancen im Zusammenhang mit Kryptografie. Mit dieser Bibliothek ist es fast unmöglich, etwas falsch zu machen. Darüber hinaus übernimmt Tink die volle Kontrolle über die Schlüssel und abstrahiert alle Vorgänge mit AndroidKeystore vom Entwickler.


Aber es war immer noch nur String-Verschlüsselung. Und hier sind Binary Preferences sehr erfolgreich aufgetaucht - eine Bibliothek eines einheimischen Herstellers, die ich mir schon lange ansehen wollte. Damit können Sie alle gespeicherten Daten aller Algorithmen verschlüsseln. Dazu hat es gereicht, eine Implementierung von zwei Schnittstellen zu schreiben, KeyEncryption und ValueEncryption (für Schlüssel bzw. Werte).


Infolgedessen haben wir begonnen, diese beiden Bibliotheken zusammen zu verwenden, und waren froh, dass unser Code sauberer und verständlicher wurde.


Sicherheitskrypto



Jetzt hat Google erneut beschlossen, die Entwickler zu treffen und ihr Leben im Bereich der Verschlüsselung gespeicherter Daten zu vereinfachen. Eine weitere JetPack-Bibliothek wurde angekündigt, um dies zu unterstützen. Ich habe mich gefragt, was sie dort so revolutionär geschrieben haben, und bin geklettert, um nach Dokumentation zu suchen (Spoiler: ist es nicht). Ich habe Javadoc nur in den Klassen gefunden, die in der Bibliothek enthalten sind, aber danke auch dafür. Es stellte sich heraus, dass es nur wenige Möglichkeiten gibt: Dateiverschlüsselung, SharedPreferences und Arbeiten mit Schlüsseln.


Um die Funktionalität der Bibliothek zu testen, habe ich einige Ausschnitte geschrieben:


Dateiverschlüsselung
val file = File(filesDir, "super_secure_file") val encryptedFile = EncryptedFile.Builder(file, this, "my_secret_key", EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB) .setKeysetAlias("my_test_keyset_alias") .setKeysetPrefName("keyset_pref_file") .build() val outputStream = encryptedFile.openFileOutput() outputStream.use { it.write("secret info".toByteArray()) } 

SharedPreferences-Verschlüsselung
 val encryptedPreferences = EncryptedSharedPreferences.create( "super_secret_preferences", "prefrences_master_key", this, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) encryptedPreferences.edit().putString("secret", "super secret token") 

Zu meiner großen Überraschung funktionierte alles beim ersten Mal und ich musste sehen, welchen Code sie für diese Bibliothek geschrieben hatten. Nachdem ich in die Quelle gefallen war, sah ich, dass dies tatsächlich ein Wrapper um die Tink-Bibliothek ist, den wir bereits kennen, und der geschriebene Code ist fast eins zu eins, wie wir ihn für die verschlüsselten BinaryPreferences geschrieben haben.


Ich war sehr erfreut, dass Google diesmal nicht damit begann, ein Fahrradmoped zu erfinden, sondern seine eigenen, gut etablierten Praktiken anwendete. Hoffen wir, dass das security von JetPack nicht nur auf diese Bibliothek beschränkt ist, sondern sich weiterentwickelt.


Demonstration des BinaryPreferences + Tink Bundle
Quellcode der Sicherheitskryptobibliothek
Security-Crypto-Demo

Source: https://habr.com/ru/post/de452252/


All Articles