我正在开发一个 Java Card 应用程序,我们的要求是在卡中保留一些静态数据和余额。
为了安全起见,我想制作 2 个 OwnerPIN 对象。一个对象是终端认证(即终端需要发送8字节的数据来认证自己),另一个对象是用户认证(即用户需要输入一个4位的PIN来认证自己)
只有两个认证都成功了,我们才能读取数据或者更新余额。
或者有没有关于如何在卡上实施安全以避免盗窃的其他建议?
还有在小程序开发期间选择专有类和指令字节的任何指南吗?
对于用户身份验证,OwnerPIN 无疑是一种好方法(当然还有其他选择,但 OwnerPIN 提供了安全功能(例如,撕裂保护),否则您必须手动实现)。
对于终端身份验证,没有什么可以阻止您使用基于 OwnerPIN 实例的方法。但是,根据您的安全要求,您可能希望选择某种形式的相互身份验证,而不是简单的 PIN 码。如果终端只是简单地发送一个 PIN 码(特别是如果它以纯文本形式发送),攻击者可以简单地拦截该 PIN 码(当发送到卡时),然后使用发现的 PIN 码来创建他们自己的(恶意)终端。
关于类和指令字节(尤其是关于 PIN 码验证等标准操作),我建议您坚持标准。ISO/IEC 7816-4 为此类标准操作定义了许多指令。