SHA256 mit RSA-Signatur gibt verschiedene Ausgaben auf verschiedenen Android-Geräten zurück

8

Ich entwickle eine Android-App, und ich muss java Signature class verwenden für die Datenauthentifizierung.

Auf jedem Android-Gerät kann ich Daten signieren und ihre Signatur verifizieren. Bei einem bestimmten Datenblock zum Unterschreiben, einem bestimmten Modul, einem bestimmten privaten Exponenten und einem eindeutigen öffentlichen Exponenten sind die Ausgaben meiner Signaturen je nach Gerät unterschiedlich. Ich habe es mit einer Reihe von Geräten versucht, und ich erhalte die gleichen Signaturen für Android 3.2 und 3.2.1, aber ein anderes für ein Android 2.2.x-Gerät.

Ich berechne diese Signatur aus konstanten Feldern, die ich zuvor mit einem KeyFactory mit RSA in einem Java-Projekt generiert habe. Die Schlüsselgröße ist 2048bit.

Hier ist ein Zitat des Codes, den ich benutze, um Signature und Verification anzufordern.

%Vor%

Wenn ich mich nicht irre, ist die Signatur mit SHA256 mit RSA deterministisch. Wie kann ich ein solches Verhalten erklären? Eine weitere interessante Frage, wie könnte ich diese Arbeit cross-Geräte machen, d. H. Die Signaturen wären gleich, egal welches Gerät ich verwende?

Vielen Dank im Voraus, Franck!

    
franckysnow 28.06.2012, 18:52
quelle

1 Antwort

11

Ja, SHA256withRSA ist vollständig deterministisch.

In der Theorie könnten Sie von einem Fehler betroffen sein ( siehe ein Beispiel ) in einer alten modifizierten Version der BouncyCastle-Bibliothek, die in einer der Android-Versionen gefunden wurde. Solch ein Fehler könnte beseitigt werden, wenn Sie stattdessen SHA512withRSA verwendet hätten, also zumindest die referenzierte.

Bevor Sie jedoch mit dem Hash-Algorithmus beginnen, sollten Sie in der Nähe des Ausgangs nachsehen.

Vielleicht haben Sie Ihr Byte-Array durch einen Aufruf von String.getBytes erhalten. Dieser Aufruf hängt von der standardmäßigen Plattformcodierung ab, die anders zwischen Android 2.2 und Android ist 2.3. Dies bedeutet, dass die Strings in beiden Fällen identisch sind, die Byte-Arrays jedoch möglicherweise nicht.

Um die Codierung unter Kontrolle zu bekommen und Ihre Code-Plattform unabhängig zu machen, geben Sie die Codierung als Parameter an:

%Vor%

Wenn dies nicht gelingt, gibt es ein paar weitere Taktiken, um eine plattformunabhängige Implementierung zu erreichen.

  • warte bis 2.2 mit der vermutlich fehlerhaften Bibliothek ausgeht
  • Verteilen Sie eine bekannte gute Bibliothek (jar) mit Ihrer Software. Wenn dies BouncyCastle wäre, werden Sie Probleme haben, sicherzustellen, dass Ihre und nicht Android Klassen geladen werden. Die Lösung heißt SpongyCastle.
  • spiele mit Ausrichtung / Padding. Versuchen Sie, die Nachrichtenlänge in Bytes mit 0,55, 56 oder 63 modulo 64 deckungsgleich zu machen, indem Sie Ihre eigene feste Auffüllung hinzufügen und hoffen, dass eine dieser Optionen beginnt, tragbare Signaturen zu geben. Diese Werte werden ausgewählt, um mit dem äußersten Teil des verdächtigen Algorithmus zu interagieren, der auf 512-Bit-Blöcke aufgefüllt wird.
Jirka Hanika 28.06.2012, 21:14
quelle