在Java Card中存储对称密钥

时间:2015-09-11 14:48:09

标签: cryptography javacard key-management

我正在开发一个applet,它必须与不同的终端共享一些AESKey类型的密钥。事情是,我事先并不知道它将需要处理多少终端。

由于Java Card中没有像HashTable这样的结构,因此它变得复杂了。我仍然可以修复一个上限和instanciate尽可能多的对象AESKey,但我想寻找另一种方法。

我以为我可以对字节数组做些什么,但在byte[]中存储密钥是不好的做法?

我认为答案是肯定的,只建议将其存储在瞬态数组中以进行计算。否则,我不了解AESKey个对象的作用。只是想确定。

3 个答案:

答案 0 :(得分:2)

重要的安全相关数据(如密钥和PIN)应始终存储在Javacard API的指定对象中,例如: AESKey
智能卡操作系统将执行额外的内部操作以防止值泄漏。
如果您不知道卡将遇到多少终端,您可以将密钥封装在一个作为链接列表一部分的对象:

class KeyElement{
   KeyElement next;
   AESKey key;
}

答案 1 :(得分:1)

从技术上讲,可以使用以下方案将密钥值存储在具有某种“未知安全级别”的byte[]中:

使用某些持久包装密钥仅在持久字节数组中存储密钥的包装(即加密)值。

在密钥使用之前,使用相同的包装密钥将所需的密钥解包到临时密钥对象中。然后随意使用它。

优势:可能比'许多AESKey对象方法更有效。

缺点:这很奇怪。 我会尽力不以这种方式实施。

Desclaimer:我不是加密专家,所以请确认我的想法。

Desclaimer 2:当然最合理的方法是使用密钥推导,因为Maarten Bodewes指出......

答案 2 :(得分:0)

事实上,在Java Card中可以创建AESKey数组。我认为只有字节数组(byte[])被授权但没有。

所以如果我认为我必须修改一个上限以限制我的applet中的键数,那么没有禁止我声明一个AESKey数组(AESKey[])。