2012-04-12 19 views
27

Quindi la lettura di questo post: How can I calculate the SHA-256 hash of a string in Android?fa ogni supporto telefono Android SHA-256

e la documentazione: http://developer.android.com/reference/java/security/MessageDigest.html

Sono curioso; quali telefoni supporteranno SHA-256? Nei documenti, la riga relativa a "NoSuchAlgorithmException" mi fa pensare che alcuni telefoni non supportino tutti gli algoritmi. Prima di implementare questo per un'applicazione e aspettandomi che funzioni allo stesso modo su tutti i telefoni, voglio sapere se qualcuno sa qualcosa di questo ...?

Trovo strano che la classe MessageDigest non abbia alcune costanti per scegliere l'algoritmo che si desidera utilizzare.

+5

+1 Buona domanda. Sono completamente d'accordo che ci dovrebbero essere costanti. –

risposta

23

Tutti i dispositivi Android supportano SHA-256. NoSuchAlgorithmException indica che non è stato possibile trovare un algoritmo richiesto ed è necessario perché il metodo accetta un argomento String per il nome dell'algoritmo. Se passate in "foo-256", l'unica risorsa del metodo è di lanciare un NoSuchAlgorithmException perché, per ragioni che vanno oltre la mia comprensione, non esiste un algoritmo chiamato "foo-256". Supponendo che stai trasmettendo un nome che sei sicuro sia un algoritmo che può essere utilizzato da Android, non vedrai mai quell'eccezione.

+1

Mentre per lo più sono d'accordo, non puoi essere sicuro al 100% che * tutti * i dispositivi supportino SHA-256. Per quanto improbabile, qualcuno potrebbe decidere di salvare alcuni byte e portarlo fuori. Tanto più che, a meno che il dispositivo non abbia l'app Market/Play, non esiste una definizione chiara su cosa debba supportare Android. Puoi sempre elencare algoritmi/meccanismi supportati con qualcosa di simile se devi essere sicuro: http://stackoverflow.com/questions/3683302/how-to-find-out-what-algorithm-encryption-are-supported-by -my-jvm –

+3

Bene: 1. Android non ha mai usato il JDK: sia le librerie principali (alcune derivate da Apache Harmony) che la JVM (Dalvik) sono le sue. 2. 'MessageDigest' è solo un'interfaccia JCE, per poter usare SHA-256, MD5 o qualsiasi altra cosa, ci deve essere un' Provider' che implementa quegli algoritmi. Il fornitore JCE di Android è derivato da BouncyCastle ed è noto per essere abbastanza spogliato, specialmente nelle precedenti versioni di Android. I produttori personalizzano sia la struttura, a volte in modo abbastanza aggressivo. Ciò potrebbe includere anche il provider JCE di sistema. –

+3

In realtà manca il punto: interfaccia! = Implementazione. –

12

Aggiungi NoSuchAlgorithmException come di seguito:

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 non è supportato nelle versioni più vecchie di Android (verificato lo stesso in Android 4.0.3, 4.1.1). Ho riscontrato questo problema durante l'utilizzo di JSCEP. L'algoritmo di digest restituito dal server SCEP è SHA-256. Ma SHA-256withRSA non è presente in nessun SecurityProvider predefinito in quelle versioni di Android. Trovato un collegamento rilevante: Which versions of Android support which package signing algorithms?

Questo link mostra che SHA-256withRSA è stato aggiunto in seguito: https://android-review.googlesource.com/44360