我想编写我的小程序,使其 APDU 命令和状态字在我的卡和读卡器之间的传输通道中不清晰。我的意思是我不想将 APDU 命令和响应发送为第三方的纯文本。
我想我有两个选择:
- 在卡上选择我的小程序后,对于所有其他命令,对 APDU 命令的数据部分执行加密功能并在卡上对其进行解密,然后对其进行分析。请注意,我无法使用此方法对整个命令进行加密,因为结果可能与另一个 APDU 命令冲突,并且卡的 SD 将其错误地
SELECT
识别为命令。SELECT
那正确吗?
其示意图:
- 使用 SD 安全通道:据我所知,安全通道意味着:整个APDU 命令和响应以加密形式传输(即它们在源(安全域/读卡器)中加密并在目标(安全域/卡)中解密读者). 对吗?据我所知,SD 在这个机制中扮演着密码学方法的角色,我的小程序和 SD 之间的通信很简单(下图),对吧?
其示意图:
还有其他方法吗?
似乎第一个解决方案还不够好,因为:
- 我必须自己实现!:)
- 我们无法对第三方隐藏命令和响应的所有部分。(我们只能隐藏数据)
我对吗?
现在,假设我想确保我的小程序仅适用于使用安全通道传输的 APDU 命令。我想我又有两个选择:
将卡片置于
SECURED
状态。由于在这种状态下用户无法使用纯文本 APDU 命令与卡进行通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。正确的?如果不正确,有什么方法可以强制 SD 仅使用安全通道?将卡保持在任何生命周期中(例如 OP_READY),但是,在接收到任何 APDU 命令时,检查CLA部分以查看它是否是安全传输的!(有可能吗?
CLA
来自安全通道的部分 APDU 命令和其他命令之间有什么区别吗?我说的对吗?)
还有其他方法吗?
最后是主要问题:
如何使用 SD 与我的小程序进行安全通信?由于我认为我必须使用 GlobalPlatform 类(我是吗?),所以我查看了它的 API-s。我getSecureChannel
在一个名为org.globalplatform.GPSystem
. 我的方式正确吗?我必须使用这种方法吗?
我知道这可能太长无法回答,但我相信它不仅为我澄清了很多问题,也为其他未来的观众澄清了很多问题。
我感谢任何机构为我阐明这个问题。
并且一个示例小程序更可观。