我正在开发一个applet,它必须与不同的终端共享一些AESKey
类型的密钥。事情是,我事先并不知道它将需要处理多少终端。
由于Java Card中没有像HashTable
这样的结构,因此它变得复杂了。我仍然可以修复一个上限和instanciate尽可能多的对象AESKey
,但我想寻找另一种方法。
我以为我可以对字节数组做些什么,但在byte[]
中存储密钥是不好的做法?
我认为答案是肯定的,只建议将其存储在瞬态数组中以进行计算。否则,我不了解AESKey
个对象的作用。只是想确定。
答案 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[]
)。