每个安卓手机都支持SHA-256吗?

39

阅读这篇文章:如何在Android中计算字符串的SHA-256哈希值?

以及文档:http://developer.android.com/reference/java/security/MessageDigest.html

我很好奇,哪些手机支持SHA-256?在文档中,关于“NoSuchAlgorithmException”的那行使我想到一些手机不支持所有算法。在我实现应用并期望在所有手机上都能正常工作之前,我想知道有没有人了解这方面的情况...?

我觉得MessageDigest类没有一些常量来选择要使用的算法很奇怪。


6
+1 很好的问题。我完全同意应该有常量。 - Chris Cashwell
4个回答

33

所有Android设备均支持SHA-256。 NoSuchAlgorithmException 表示找不到所请求的算法,这是必要的,因为该方法需要一个 String 参数作为算法名称。如果您传递了“foo-256”,则该方法的唯一手段就是抛出 NoSuchAlgorithmException,因为由于我无法理解的原因,没有叫做“foo-256”的算法。假设您传递的是Android可以使用的算法名称,则永远不会看到该异常。


2
虽然我基本上同意,但你不能百分之百确定所有设备都支持SHA-256。尽管不太可能,但有人可能决定节省一些字节并将其删除。特别是因为,除非设备具有Market/Play应用程序,否则没有明确的定义'Android'必须支持什么。如果需要确保,您可以始终使用类似于此的内容列出支持的算法/机制:https://dev59.com/uHA65IYBdhLWcg3wsgyA - Nikolay Elenkov
4
  1. Android从未使用JDK:其核心库(一些源自Apache Harmony)和JVM(Dalvik)都是自己的。
  2. MessageDigest只是一个JCE接口,要使用SHA-256、MD5或其他算法,需要有实现这些算法的“提供者”(Provider)。Android的JCE提供程序源于BouncyCastle,并且众所周知在早期的Android版本中被大幅度裁剪。制造商确实会定制框架,有时会进行相当激进的修改,这可能包括系统JCE提供程序。
- Nikolay Elenkov
3
你实际上误解了重点:接口 != 实现。 - Nikolay Elenkov

22

在下面添加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);
}

8
根据Android文档关于MessageDigest的说明,SHA-256从API 1开始得到支持。

enter image description here


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接