我想用这样一种方式编写我的applet :它的APDU命令和状态词在我的卡和阅读器之间的传输通道中不清晰。我的意思是我不想发送APDU命令和响应为第三方的纯文本。
我想我有两个选择:
SELECT APDU命令发生冲突,而卡的SD错误地将其识别为SELECT命令。是那么回事吗?其图表:

其图表:

还有别的办法吗?
第一个解决方案似乎不够好,因为:
我说的对吗?
现在,假设我希望确保我的applet只适用于使用安全通道传输的APDU命令。我想我又有两个选择:
SECURED状态。由于用户无法在此状态下使用纯文本APDU命令与卡通信(对吗?)因此,他必须使用安全通道将命令发送给我的applet。对吗?如果不正确,是否有办法强迫SD只与安全通道一起工作?CLA部分与其他部分有什么区别吗?我说得对吗?还有别的办法吗?
最后,主要问题是:
如何使用SD与我的applet进行安全的通信?因为我认为我必须使用GlobalPlatform类(是吗?),我看了一下它的API-s。我在一个名为getSecureChannel的包中找到了一个名为org.globalplatform.GPSystem的方法。我做得对吗?我必须用这个方法吗?
我知道这可能太长,无法回答,但我相信,它不仅澄清了许多问题,不仅对我,也对其他未来的观众。
我很感谢有人为我在这个问题上提供了任何帮助。
而一个小程序样本则更有价值。
发布于 2015-04-16 10:34:14
我会按顺序回答:
发布于 2015-06-15 07:17:57
不要担心通过applet进行安全的信道通信。如果在applet中使用,这是非常简单的。
您不需要考虑很多问题,只要尝试编写一个安全通道applet,它就会按照命令数据中定义的安全级别来处理applet。
参考GP安全通道APIs:http://www.win.tue.nl/pinpasjc/docs/apis/gp22/
你应该把卡保持在安全状态。
这是用于安全通道scp02的示例applet:
package secureChannel;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import org.globalplatform.GPSystem;
import org.globalplatform.SecureChannel;
public class Scp02 extends Applet
{
final static byte INIT_UPDATE = (byte) 0x50;
final static byte EXT_AUTHENTICATE = (byte) 0x82;
final static byte STORE_DATA = (byte) 0xE2;
public static void install(byte[] bArray, short sOffset, byte bLength)
{
new Scp02().register(bArray, sOffset, bLength);
}
public void process(APDU apdu) throws ISOException
{
SecureChannel sc = GPSystem.getSecureChannel();
byte[] buffer = apdu.getBuffer();
short inlength = 0;
switch (ISO7816.OFFSET_INS)
{
case INIT_UPDATE:
case EXT_AUTHENTICATE:
inlength = apdu.setIncomingAndReceive();
sc.processSecurity(apdu);
break;
case STORE_DATA:
//Receive command data
inlength = apdu.setIncomingAndReceive();
inlength = sc.unwrap(buffer, (short) 0, inlength);
apdu.setOutgoingAndSend((short)0, inlength);
//Process data
break;
}
}
}发布于 2019-01-04 11:21:58
出于Google搜索的考虑,Anurag Bajpai的代码不能工作而不做任何修改,因为正如GP安全通道API中所述,applet应该输出最终的响应数据:
如果存在响应数据,则该数据将放在偏移量ISO7816.OFFSET_CDATA处的APDU缓冲区中。返回值表示长度,如果有必要,applet负责输出这些数据。
因此,修正后的代码是:
package secureChannel;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import org.globalplatform.GPSystem;
import org.globalplatform.SecureChannel;
public class Scp02 extends Applet
{
final static byte INIT_UPDATE = (byte) 0x50;
final static byte EXT_AUTHENTICATE = (byte) 0x82;
final static byte STORE_DATA = (byte) 0xE2;
public static void install(byte[] bArray, short sOffset, byte bLength)
{
new Scp02().register(bArray, sOffset, bLength);
}
public void process(APDU apdu) throws ISOException
{
SecureChannel sc = GPSystem.getSecureChannel();
byte[] buffer = apdu.getBuffer();
short inlength = 0;
switch (ISO7816.OFFSET_INS)
{
case INIT_UPDATE:
case EXT_AUTHENTICATE:
inlength = apdu.setIncomingAndReceive();
short respLen = sc.processSecurity(apdu);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, respLen);
break;
case STORE_DATA:
//Receive command data
inlength = apdu.setIncomingAndReceive();
inlength = sc.unwrap(buffer, (short) 0, inlength);
apdu.setOutgoingAndSend((short)0, inlength);
//Process data
break;
}
}}
https://stackoverflow.com/questions/29455715
复制相似问题