我正在开发一个applet,它必须与不同的终端共享AESKey
类型的一些密钥。问题是我事先不知道它要处理多少终端。
由于Java Card中没有HashTable
这样的结构,它变得越来越复杂。我仍然可以固定一个上限,并实例化尽可能多的对象AESKey
,但我想寻找另一种方法。
我想我可以用字节数组做一些事情,但是在byte[]
中存储键是一种不好的做法吗?
我认为答案是肯定的,只建议将其存储在瞬态数组中以进行计算。否则,我不理解AESKey
对象的作用。我只是想确认一下。
重要的安全相关数据,如密钥和pin,应始终存储在Javacard API中指定的对象中,例如AESKey
.
智能卡操作系统将执行额外的内部操作来保护这些值不被泄露。
如果你不知道卡片会遇到多少个终端,你可以把键封装在一个对象中,这个对象是链表的一部分:
class KeyElement{
KeyElement next;
AESKey key;
}
从技术上讲,可以使用以下方案在具有某些'未知安全级别'的byte[]
中存储键值:
使用一些持久包装密钥在持久字节数组中仅存储封装(即加密)的密钥值。
在使用键之前,使用相同的封装键将所需的键展开到瞬态键对象中。然后随意使用
优势:可能比"许多AESKey
对象方法"更节省内存。
缺点:很奇怪。我将尽我最大的努力不这样实现
免责声明:我不是加密专家,所以请验证我的想法。
声明2:当然最合理的方法是使用密钥派生,正如Maarten Bodewes所指出的…
实际上,在Java Card中创建AESKey
数组是可能的。我以为只有字节数组(byte[]
)被授权,但没有。
因此,如果我认为我必须固定一个上限来限制applet中键的数量,那么没有什么可以禁止我声明AESKey
数组(AESKey[]
)。