2012-04-12 44 views
27

那麼閱讀這篇文章:How can I calculate the SHA-256 hash of a string in Android?是否每個Android手機支持SHA-256

和文檔:http://developer.android.com/reference/java/security/MessageDigest.html

我很好奇;哪些手機將支持SHA-256?在文檔中,關於'NoSuchAlgorithmException'的一行使我認爲有些手機不支持所有算法。在我爲一個應用程序執行此應用程序並希望它在所有手機上都能正常工作之前,我想知道是否有人對此有所瞭解......?

我覺得很奇怪MessageDigest類沒有一些常量來選擇你想要使用的算法。

+5

+1問得好。我完全同意應該有常數。 – 2012-04-12 18:24:28

回答

23

所有的Android設備都支持SHA-256。 NoSuchAlgorithmException表示無法找到請求的算法,因爲該算法名稱採用String參數,所以這是必要的。如果你通過了「foo-256」,那麼該方法唯一的辦法是拋出一個NoSuchAlgorithmException,因爲出於我理解之外的原因,沒有稱爲「foo-256」的算法。假設你傳遞了一個名字,你肯定是一個Android可以使用的算法,你永遠不會看到這個異常。

+1

儘管我大多數人都同意,但您不能100%確定所有*設備都支持SHA-256。但不太可能,有人可能會決定保存幾個字節並將其取出。尤其是,除非設備具有市場/應用程序,否則沒有關於「Android」必須支持的明確定義。如果您需要確定,您可以隨時列出支持的算法/機制:http://stackoverflow.com/questions/3683302/how-to-find-out-what-algorithm-encryption-are-supported-by -my-jvm – 2012-04-13 02:27:41

+3

嗯:1. Android從未使用JDK:核心庫(一些來自Apache Harmony)和JVM(Dalvik)都是它自己的。 2.'MessageDigest'只是一個JCE接口,爲了能夠使用SHA-256,MD5或其他,需要一個'Provider'來實現這些算法。 Android的JCE提供程序是從BouncyCastle派生而來的,並且已知很少被剝離,特別是在早期的Android版本中。製造商確實定製了這個框架,有時候相當積極。這可能還包括系統JCE提供者。 – 2012-04-13 15:28:25

+3

您實際上錯過了一點:interface!= implementation。 – 2012-04-16 13:27:58

12

添加拋出:NoSuchAlgorithmException如下:

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); 
}