我注意到我的智能卡上有一些非常奇怪的行为(NXP J2E145,J3A081,带有Omnikey 5121读卡器的J3C145):在调用JavaCard方法后立即断电
JCSystem.requestObjectDeletion()
Run Code Online (Sandbox Code Playgroud)
可能会损坏卡:在大约10%的这种断电后,ATR命令非常慢(1000毫秒),我对任何其他APDU(小程序选择,卡管理器认证等)都没有响应.
我知道requestObjectDeletion()的行为取决于供应商的具体实现,所以我的问题非常广泛和开放......
垃圾收集是否"通常"在一次交易中处理?
是否有任何"官方"建议不要在可能的断电情况下调用requestObjectDeletion()?
恩智浦有没有类似的卡片经验?
编辑:
当尝试连接到损坏的卡的卡管理器小程序时,Eclipse IDE中的JCOP shell报告:
ATR:3BFB9600008131FE454F4450204D41502053414D3E
ATR:T = 1
jcshell:终端未知问题.最后一个终端错误:由于I/O设备错误,无法执行请求.
我使用 Firebase Cloud Messaging 向我的 Android 客户端应用程序发送通知,每个通知应根据其注册令牌发送到单个设备。
每次我通过https://fcm.googleapis.com/fcm/send发送通知时,我都会收到这样的 JSON 响应:
{
"multicast_id": 108,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
{ "message_id": "1:08" }
]
}
Run Code Online (Sandbox Code Playgroud)
我发现success和failure多余的 - 它们不是同一件事吗?我应该检查他们两个以确保一切正常吗?总是这样success != failure吗?
android json firebase firebase-cloud-messaging firebase-notifications
当我们在兼容Java卡3.0的卡中运行Web服务器时,我们如何请求该服务器,或者更确切地说我们请求该服务器的IP地址.还有更多的Android应用程序请求并从服务器获得响应,如果是这样我们怎么能这样做?
我有一个 JavaCard 小程序,可以在智能手机中处理 Gemalto SIM 卡。我想创建一个在指定日期和时间有效的电子钱包。
我知道使用经典智能卡是不可能的,因为没有电池,它里面没有时钟。然而,使用 SIM 卡可能是这样:当连接到网络时,SIM 卡必须对网络时间(不是本地系统时间,用户可以更改)有一定的访问权,并且最后已知的网络时间值可能是可能存储在 SIM 卡上的某个地方。
有没有办法以安全的方式从我的小程序访问最后一个已知的网络时间?(我不相信手机中安装的任何应用程序,因为它很容易被黑客入侵)
你认为我的问题还有其他解决方案吗?
编辑
我没有提到我想到这个的原因:我需要在没有互联网连接的情况下解决这个问题,因为我的客户应该在他们的手机中没有互联网连接的情况下使用我的电子钱包。他们需要在没有信号的地铁中使用它,其中一些人根本不支付互联网连接费用。所以我的应用程序必须能够找出离线时间。
编辑 2
在 Android 手机上,有一个选项:

这意味着有一些独立于用户的时间来源。问题是,是否可以通过 SIM 卡上的 JavaCard 小程序以安全的方式访问它。(或者如果在没有连接的情况下可以访问最后一个已知值)
我已经开始使用 JavaCards 并试图掌握 CLA 字节的含义。
5.4.1 类字节
根据与表 9 结合使用的表 8,命令的类字节 CLA 用于指示命令和响应在多大程度上符合 ISO/IEC 7816 的本部分以及在适用时(参见表 9),其格式安全消息传递和逻辑通道号。
那么... CLA 标志用于指示,但具体是什么?因为,表格和描述对于初学者来说相当困难,我知道通常使用下一个 CLA 字节:0x00, 0x80, 0x84.
例如,如果要从表中读取内容:
0X' 根据 ISO/IEC 7816 本部分的命令和响应的结构和编码('X' 的编码见表 9)
10 至 7F RFU
我明白,为了精细开发,我应该阅读GlobalPlatform规范,有关确切卡的规范(我的是NXP的)和其他相关材料,但我想承认,理解这些内容很困难。
我期望以下内容(伪表):
来自Java Card API 2.2.1的一些引用:
Signature 课程描述:
撕裂或卡重置事件将初始化的Signature对象重置为先前通过调用init()初始化时所处的状态.对于支持与临时密钥数据集,如DES,三重DES,AES,和韩国SEED签名对象密钥成为与用来初始化签名对象的密钥对象相关联的清除事件未初始化密钥的算法.
Signature.init(...) 描述:
为了获得最佳性能,当theKey参数是临时密钥时,实现应尽可能使用瞬态空间进行内部存储.
这是否意味着有些算法需要在每次Signature.init(...)调用时重写持久性内存?如果是的话,这种不愉快的行为有什么理由吗?
我问这个问题,因为我在applet中遇到了一个奇怪的行为.它计算ECDSA签名.在大约10万个签名后,卡(J2X145 by NXP)似乎坏了(我不能再选择applet了).持续的内存损坏可能是原因,因为我Signature.init(...)每次收到输入数据时都会调用.这可能Signature.init(...)是这种行为的原因吗?
我正在尝试使用自行开发的Web API来检索一些数据.文档全部用PHP编写.我正在看的例子是这样的:
$params = array(
'id' => 1
,'data' => array(
,'email' => 'example@hasoffers.com'
)
$url = "www.someapi.com/api?" . http_build_query( $params );
Run Code Online (Sandbox Code Playgroud)
我正在使用C#WebClient类,但我无法弄清楚如何序列化数据参数:
WebClient wc = new WebClient();
wc.QueryString["id"] = "1";
wc.QueryString["data"] = // I have no idea.
string json = wc.DownloadString(apiUrl);
Run Code Online (Sandbox Code Playgroud)
我尝试了一些变化:
wc.QueryString["data"] = "email=test@stackoverflow.com";
wc.QueryString["data"] = Uri.EscapeDataString("data[email]=test@stackoverflow.com");
wc.QueryString["data"] = Uri.EscapeDataString("email[0]=test@stackoverflow.com");
wc.QueryString["data"] = Uri.EscapeDataString("email=test@stackoverflow.com");
Run Code Online (Sandbox Code Playgroud)
当然,我没有任何地方的PHP设置来查看http_build_query()实际返回的内容.
几天前我遇到了一个非常愚蠢的错误.它是由我从第三方库获得的枚举引起的:
[Flags]
public enum MyStatus
{
OKResponse = 0,
ResponseTooBig = 1,
ErrorMessage = 2,
NoResponse = 4,
...
}
Run Code Online (Sandbox Code Playgroud)
我习惯用这种方式检查标志:
if ((status & MyStatus.OKResponse) != 0) {...}
Run Code Online (Sandbox Code Playgroud)
但它不起作用MyStatus.OKResponse,因为它是零.它根本不是一面旗帜,它缺少所有旗帜.当然,当我发现错误时,我意识到这OKResponse是唯一的非错误状态,所以它的确意味着"没有错误,没有标志".但是,我真的不觉得这很明显.
在标志枚举中将0定义为值之一是一个坏习惯吗?推荐的方式是什么?检查标志的最佳方法是什么,也可以使用"无标志"标志?
我想在Java Card上优化SHA-3算法.我需要一个消耗更少内存的快速算法,这样可以轻松转换byte[]为short[](或缩短[]为byte[]).我目前的实现如下:
private short[] byteToShort(byte[] b,int len)
{
short len_conv = (short)(len/2);
for ( short x = 0; x < len_conv;x++)
{
for ( short j = 0 ; j < 2 ; j++)
aux[j] = b[2*x+j];
temp_conv[x] = (short)((((short)aux[1]) & 0xFF) | ((((short)(aux[0]) & 0xFF) << 8 )));
}
return temp_conv;
}
Run Code Online (Sandbox Code Playgroud)
其中len是b数组的实际大小,aux并且temp_conv被定义为private并分配为:
short[] temp_conv = JCSystem.makeTransientShortArray((short)255,JCSystem.CLEAR_ON_DESELECT); // used during conversion
byte[] aux …Run Code Online (Sandbox Code Playgroud) 我是 Java Card 开发的新手,我正在尝试开发一个可以选择和读取 EF 数据的小程序。我想用一些假数据创建 EF 和 DF,并将其存储在卡中。然后我会用我的小程序来读取这些数据。是否可以?如果是这样,我该怎么做?请帮助,我已经搜索了很多,但我没有找到任何解决方案。
非常感谢。
我有一个long.我知道这long不是很大.实际上,它可以编码为7个字节的无符号整数.
我想我写long到byte[7]使用ByteBuffer和小端.
这个
long myLong = ... //some value
byte[] myLongBytes = ByteBuffer.allocate(7).order(ByteOrder.LITTLE_ENDIAN).putLong(myLong).array();
Run Code Online (Sandbox Code Playgroud)
IndexOutOfBoundsException当然是投掷.我甚至可以这样做ByteBuffer吗?我应该以不同的方式做吗?
javacard ×7
smartcard ×4
android ×2
c# ×2
java ×2
sim-card ×2
applet ×1
arrays ×1
bytebuffer ×1
eeprom ×1
endianness ×1
enums ×1
firebase ×1
flags ×1
gsm ×1
json ×1
long-integer ×1
php ×1
query-string ×1
time ×1
transactions ×1