将对称密钥存储在 Java 卡中

Store symmetric keys in Java Card

我正在开发一个小程序,它必须与不同的终端共享一些 AESKey 类型的键。问题是我事先不知道它需要处理多少个终端。

由于Java卡中没有HashTable这样的结构,所以比较复杂。我仍然可以修复上限并实例化尽可能多的对象 AESKey 但我想寻找另一种方法。

我想我可以用字节数组做一些事情,但是在 byte[] 中存储键是一种不好的做法吗?

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

密钥和 PIN 等重要的安全相关数据应始终存储在 Javacard API 中指定的对象中,例如AESKey.
智能卡操作系统将执行额外的内部操作来保护那里的值不被泄露。
如果你不知道卡会遇到多少终端,你可以封装密钥在作为链表一部分的对象中:

class KeyElement{
   KeyElement next;
   AESKey key;
}

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

因此,如果我认为我必须修复上限以限制我的小程序中的键数,我就可以声明一个 AESKey 数组 (AESKey[])。

从技术上讲,可以使用以下方案将键值存储在 byte[] 和一些 'unknown level of security' 中:

使用一些持久包装密钥.

仅将密钥的包装(即加密)值存储在持久字节数组中

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

优势:可能比 'many AESKey objects approach'.

的内存效率更高

缺点:比较奇怪。 我尽量不要这样实现。

免责声明:我不是加密专家,所以请验证我的想法。

免责声明 2:当然,最合理的方法是使用 Maarten Bodewes 指出的密钥派生...