【问题标题】:Java Card 2.2.2: temporary RSA public key as transientJava Card 2.2.2:临时 RSA 公钥作为瞬态
【发布时间】:2016-03-10 20:04:09
【问题描述】:

我正在设计一个 Java Card(2.2.2 因此是 Classic)小程序,它在每次使用时都会接收一个 RSA 公钥(使用对问题无关紧要的方式进行验证),然后使用该 RSA 公钥来验证一个 RSA签名。

出于性能和设备寿命的原因,我如何将 RSA 公钥保存在 RAM 中(而不是将其写入 EEPROM/闪存)?

我的问题是,在 JC 2.2.2 的 javacard.security.KeyBuilder 中,buildKey(byte keyType, short keyLength, boolean keyEncryption) API 似乎没有指定临时内存的选项;没看到

beginTransaction()abortTransaction() 括住我的RSA 公钥的所有更改和使用是否能实现我的目标?

【问题讨论】:

  • @MaartenBodewes:作为 Java Card 常驻专家,请将此问题标记为引起您的注意。
  • 这个“标记”不起作用...
  • 我猜 java 卡对 RSA 密钥对没有 TRANSIENT 功能,因为 RSA 长密钥大小对于 RAM 限制来说太大了。 (单个 RSA 2048 公钥至少需要 2K 内存!
  • @Abraham:你的“2K RAM”是Kibibit,而不是Kibibyte。 256 字节的 RAM(加上一些典型的公共指数)完全在 Java Card TRANSIENT 可以容纳的范围内。

标签: smartcard javacard


【解决方案1】:

我一直在处理完全相同的问题,并且不得不使用持久内存和磨损均衡(这很有效)。

甚至对beginTransaction()/abortTransaction() 也有同样的想法,但卡制造商告诉他们这行不通(他们说这会使 EEPROM 寿命变得更糟)。 YMMV。

一些备注:

  • 性能足以满足给定的用例(这让我感到惊讶)。

  • 可以很好地估计卡的寿命(假设您知道永久内存有多少次重写周期、块大小、不同公钥使用的频率和磨损均衡开销)。

  • 考虑将RSAPublicKeyCipher 对象一起磨损均衡。

  • 尽可能多地为对象池使用内存。

可能有一些供应商特定的 API 允许 RSA 计算(在我们的例子中没有这种可能性)

祝你好运!

【讨论】:

  • 感谢现场体验。关于耐力; Java Card 制造商告诉我,所有对 EEPROM 的写入都通过相同的缓冲区和处理原子写入的标志,这是保证持久性的瓶颈;以至于软件中的磨损均衡平均会产生较低的额外耐用性,而在大样本中最坏的情况下几乎没有额外的耐用性;或者写倒计时没有奖金(事实并非如此)。这是有道理的。然而,那是近十年前的事了。既然 EEPROM 经常由具有磨损均衡的 Flash 模拟,这种推理可能不再适用。
  • @fgrieu 不能说比这个答案更多了。 3.0 改进了这一点是有充分理由的。
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 2015-06-07
  • 2015-10-19
  • 2011-03-10
  • 2018-12-22
  • 1970-01-01
  • 2017-02-06
  • 2020-12-19
相关资源
最近更新 更多