2012-04-12 10 views
27

diesen Beitrag So lesen: How can I calculate the SHA-256 hash of a string in Android?Hat jede Android-Handy Unterstützung SHA-256

und die Dokumentation: http://developer.android.com/reference/java/security/MessageDigest.html

Ich bin gespannt; Welche Telefone unterstützen SHA-256? In den Dokumenten lässt mich die Zeile über die "NoSuchAlgorithmException" denken, dass einige Telefone nicht alle Algorithmen unterstützen. Bevor ich das für eine App implementiere und erwarte, dass es auf allen Telefonen gleich funktioniert, möchte ich wissen, ob jemand etwas darüber weiß ...?

Ich finde es seltsam, dass die MessageDigest-Klasse nicht über einige Konstanten verfügt, um den Algorithmus auszuwählen, den Sie verwenden möchten.

+5

+1 Gute Frage. Ich stimme völlig zu, dass es Konstanten geben sollte. –

Antwort

23

Alle Android-Geräte unterstützen SHA-256. Die NoSuchAlgorithmException gibt an, dass ein angeforderter Algorithmus nicht gefunden werden konnte und erforderlich ist, da die Methode ein Argument String für den Algorithmusname verwendet. Wenn Sie "foo-256" übergeben, ist die einzige Möglichkeit der Methode, eine NoSuchAlgorithmException zu werfen, weil aus Gründen, die ich nicht verstehe, es keinen Algorithmus namens "foo-256" gibt. Angenommen, Sie übergeben einen Namen, von dem Sie sicher sind, dass er ein Algorithmus ist, den Android verwenden kann, werden Sie diese Ausnahme nie sehen.

+1

Obwohl ich größtenteils zustimme, kann man nicht 100% sicher sein, dass * alle * Geräte SHA-256 unterstützen. Es ist jedoch unwahrscheinlich, dass sich jemand dafür entscheidet, ein paar Bytes zu speichern und es herauszunehmen. Insbesondere, wenn das Gerät die Market/Play-App nicht hat, gibt es keine klare Definition darüber, was "Android" zu unterstützen hat. Sie können unterstützte Algorithmen/Mechanismen immer mit so etwas auflisten, wenn Sie sicher sein müssen: http://stackoverflow.com/questions/3683302/how-to-find-out-what-algorithm-encryption-are-supported-by -my-jvm –

+3

Nun: 1. Android hat das JDK nie benutzt: Sowohl die Kernbibliotheken (einige von Apache Harmony abgeleitet) als auch die JVM (Dalvik) sind ihre eigenen. 2. 'MessageDigest' ist nur eine JCE-Schnittstelle, um SHA-256, MD5 oder was auch immer verwenden zu können, muss es einen' Provider' geben, der diese Algorithmen implementiert. Der JCE-Anbieter von Android ist von BouncyCastle abgeleitet und ist bekanntlich vor allem in früheren Android-Versionen ziemlich entkleidet. Hersteller passen beide den Rahmen an, manchmal ziemlich aggressiv. Das könnte auch den System-JCE-Provider einschließen. –

+3

Sie vermissen eigentlich den Punkt: Schnittstelle! = Implementierung. –

12

hinzufügen NoSuchAlgorithmException wie folgt:

public static String SHA256 (String text) throws NoSuchAlgorithmException { 

    MessageDigest md = MessageDigest.getInstance("SHA-256"); 

    md.update(text.getBytes()); 
    byte[] digest = md.digest(); 

    return Base64.encodeToString(digest, Base64.DEFAULT); 
} 
4

SHA-256withRSA ist NICHT in älteren Android-Versionen unterstützt (verifiziert die gleiche in Android 4.0.3, 4.1.1). Ich habe dieses Problem bei der Verwendung von JSCEP festgestellt. Der vom SCEP-Server zurückgegebene Digest-Algorithmus ist SHA-256. Aber SHA-256withRSA ist in keinem dieser Standard-SecurityProvider in diesen Android-Versionen vorhanden. Fand einen entsprechenden Link: Which versions of Android support which package signing algorithms?

Dieser Link zeigt, dass SHA-256withRSA wurde später hinzugefügt: https://android-review.googlesource.com/44360