如何在 Java Card 2.2.1 上实现 SHA256?

How to implement SHA256 on Java Card 2.2.1?

我正在尝试在 Java 卡版本 2.2.1 上实施 RSA 登录。我已经实施了 RSA 2048 并成功测试了它,但是当尝试使用 MessageDigest class 进行散列时,我无法得到正确的响应答案。

这是我的代码:

MessageDigest md = MessageDigest.getInstance(MessageDigest.ALG_SHA, false);
md.reset();
md.doFinal(toSign, bOffset, bLength, tempBuffer, (short) 0);`

但是我没有得到正确答案; ALG_SHA 也不 ALG_MD5.

我想知道问题出在哪里。我见过的所有样本都使用相同的方法和参数。

Java Card 2.2.1 规范不支持 SHA-256(或任何其他 SHA-2 消息摘要)。它只支持 SHA1 和 MD5 这两种完全不同的密码哈希函数。因此,MessageDigest.ALG_SHAMessageDigest.ALG_MD5 都不会为您提供可以计算 SHA-256 哈希函数的 MessageDigest 实例。

只有 Java 卡 2.2.2 及以上版本支持各种 SHA2 函数。在该规范中,MessageDigest class 也将支持

  • SHA-256: MessageDigest.ALG_SHA_256,
  • SHA-384:MessageDigest.ALG_SHA_384,以及
  • SHA-512:MessageDigest.ALG_SHA_512.

因此,如果您幸运并且您的卡实际上支持 Java Card 2.2.2,您实际上可以使用这些常量来获得适当的 MessageDigest 对象。

如果你的卡不支持JavaCard 2.2.2,那你当然不能用不应该1 能够使用 那些常量。你仍然可以查看你的卡的手册,如果它支持 MessageDigest 的一些专有实现,它也支持 SHA-256,尽管我非常怀疑。



1) 感谢 vlp for pointing out that there are actually cards that are Java Card 2.2.1 (or below) that seemingly support using the constants for SHA-2 algorithms introduced in the Java Card 2.2.2 API. This might just be caused by other implementation bugs and nobody seems to have tested if these algorithms actually work on those cards. See the JCAlgTest list 的调查结果。