1、前言
随着移动商业应用程序从时髦的口号逐渐变成现实,对于移动用户和无线应用程序开发人员而言,安全性正在成为一个重要方面。在移动商业网络中,网络整体安全性的强度取决于客户端设备,无线信号的可截取本质以及大多数手持设备有限的内存和计算能力。这些使无线系统极易受到数据窃贼的攻击。对于如何有效地保护自己的无线应用程序及运行应用程序的网络而言,开发平台的选择将始终起到举足轻重的作用。
将Java 平台用于无线设备开发的最大优点是能够生产可在多种平台上运行的可移植程序代码。但即使有这个优点,各种无线设备在内存、处理能力、电池寿命、显示屏大小 和网络带宽等方面的能力差异还是相当大的。不可能将运行在成熟的机顶盒上的应用程序的全部功能都移植到行动电话上。即使对于类似的设备(如 PDA 和高级智能电话),在两者间建立可移植性也常常使一种设备超负荷而另一种设备利用不充分。只能在多组类似设备之间实现真正的可移植性。因为认识到一种规格并不能适合所有设备,所以小心地设计 J2ME 以在可移植性和可用性之间取得平衡。
在安全性API方面,J2ME中的MIDP2.0规范提供了一套核心安全性API——JSR177,里面定义了一整套JAVA平台和智能卡交互的规则和API。
本文主要介绍JSR177标准所包含的内容,以及sun提供的符合此标准的satsa1.0开发包使用方法,最后给出了一些安全应用的示例代码。
2、JSR-177
JSR-177是一种基于手机和智能卡通信通道之上的Java编程接口,可以让手机Java应用访问运行在智能卡上的数据或者应用,包括访问加密功能。JSR-177也被称为安全和信任服务API(SATSA),它使得智能卡可以充当手机Java应用的“安全组件”,令手机应用可以执行定制操作、用户身份识别以及调用定制的应用。JSR-177的广泛使用将让第三方应用开发商可以充分发挥智能卡的作用。
SATSA(JSR-177)API分为两个部分:
1、 智能卡通讯API:支持与智能卡应用程序的通讯,通讯协议包含APDU,(U)STA,JCRMI。
2、 签名服务和用户凭证API:支持格式化数字签名;支持用户凭证管理,包括用户证书申请,添加用户凭证,删除用户凭证。
JSR-177包含了四个程序可选包:
1、SATSA-APDU通讯包:支持与使用APDU的智能卡应用程序的通信;支持与(U)SIM卡的(U)SAT应用程序的通讯。
2、SATSA-JCRMI通讯包:定义Java Card RMI客户端API以支持Java Card对象的远程方法调用。
3、SATSA-PKI签名服务:支持应用层的数字签名和基本的用户凭证管理。
4、SATSA-CRYPTO密码接口:提供了一些基本的密码操作,如消息摘要,签名验证,加密,解密。
SATSA结构图
3、SATSA1.0
安装运行过程如下:
1、设置环境变量:设置JAVA_HOME;设置JC_HOME为Java Card的目录,如C:/java_card_kit-2_2_1。
2、设置PATH : 添加 %JAVA_HOME%/bin 和 %JC_HOME%/bin.;设置CLASSPATH :添加 %JAVA_HOME%/lib 和%JC_HOME%/lib。
3、将satsa-1_0-windows.zip解压到某个目录下,如C:/satsa1.0。并设置环境变量%MIDP_HOME%为C:/satsa1.0。
4、运行MIDP模拟器
C:/>%MIDP_HOME%/bin/midp
5、运行智能卡模拟器
在这里我们使用系统自带的数据存储器EEPROM:%MIDP_HOME%/bin/jc_eeprom_image。
C:/>%JC_HOME%/bin/cref.exe %MIDP_HOME%/bin/jc_eeprom_image
SATSA1.0支持以下内容:
l The PKI Card Application AID is: 0xA0 0x0 0x0 0x0 0x63 0x50 0x4B 0x43 0x53 0x2D 0x31 0x35
l The PKI Security Element ID is: WIM 1.01 SATSA RI
l Security element policy selecting a key already associated with a user certificate.
l Opaque signatures.
l Using the certificate instead of the certificate URI.
l CSR generation authorization through PIN entry (required).
l Store credential authorization through PIN entry (required).
Card application (WIM) requires PIN-G for data modification.
l Remove credential authorization through PIN entry (required).
Card application (WIM) requires PIN-G for data modification.
l Non-repudiation signature authorization through PIN entry (required).
l Authentication signature authorization (no PIN required).
l PIN-related functionality in SATSA-APDU and SATSA-JCRMI optional implementations.
l Two slots to attach a security element to the device.
l Three logical channels for the Reference Implementation security element.
l The int data type in the SATSA-JCRMI security element.
l TCP/IP as the transport protocol.
l The RSA algorithm in the SATSA-CRYPTO KeyFactory implementation.
l The MD2, MD5, and SHA-1 algorithms in the SATSA-CRYPTO MessageDigest implementation.
l The MD5withRSA and SHA1withRSA algorithms in the SATSA-CRYPTO Signature implementation.
l The DES (8 byte, 64 bit), the DESede (24 bytes, 192 bit), and the AES (16 bytes, 128 bit) keys in the SATSA-CRYPTO Cipher implementation. By default ECB is the mode and there is no padding. For the DES, DESede, and AES ciphers, CBC mode and PKCS5Padding are also available.
l The security element publishing its access control requirements in an Access Control File.
在SATSA中所有的key都为RSA密钥,长度为512bits。这里还包含了三个PIN:
l PIN 1 - a general purpose PIN that protects WIM data from modification and authentication keys. The value is 1234.
l Non-repudiation Key 1 PIN - protects the first non-repudiation key. The value is 2345.
l Non-repudiation Key 2 PIN - protects the second non-repudiation key. The value is 3456.
4、示例代码
4.1生成证书请求
使用RSA算法,生成512位长密钥对,生成证书CSR。
public void runGenCertReq() throws Exception {
Calendar bNow = Calendar.getInstance();
long b = bNow.getTime().getTime();
System.out.println(b);
boolean pass = true;
byte[] csr = null; // Buffer for generated CSR
String distinguishedName = "c=US,st=CA,l=Santa Clara,o=dummy CA,ou=JCT,cn=thehost"; // The DN
int rsaKeyLength = 512;
String securityElementID = new String("WIM 1.01 SATSA RI");
String securityElementPrompt = new String("Please insert smart card!");
boolean forceKeyGen = true; // Generate private key
// Generate a private key and a CSR
csr = UserCredentialManager.generateCSR(distinguishedName,
UserCredentialManager.ALGORITHM_RSA, rsaKeyLength,
UserCredentialManager.KEY_USAGE_NON_REPUDIATION,
securityElementID, securityElementPrompt, forceKeyGen);
Calendar eNow = Calendar.getInstance();
long e = eNow.getTime().getTime();
System.out.println(e);
System.out.println("Cert Request..." + (pass ? "pass" : "fail"));
System.out.println("使用时间: " + String.valueOf(e - b) + " 毫秒");
}
4.2摘要
生成消息摘要
public byte[] SHA1Digest(byte[] message) throws Exception {
String digestAlgo = "SHA-1";
int shaDigestLen = 20;
byte[] newDigest = new byte[shaDigestLen];
MessageDigest md;
md = MessageDigest.getInstance(digestAlgo);
md.update(message, 0, message.length);
md.digest(newDigest, 0, shaDigestLen);
return newDigest;
}
4.3签名
对字符串签名。
public byte[] RSASign(String toSign) throws Exception {
String securityElementPrompt = null;
String caName = "c=US,st=CA,l=Santa Clara,o=dummy CA,ou=JCT,cn=thehost";
String[] caNames = new String[] { caName };
byte[] signature = CMSMessageSignatureService.sign(toSign,
CMSMessageSignatureService.SIG_INCLUDE_CERTIFICATE
| CMSMessageSignatureService.SIG_INCLUDE_CONTENT,
caNames, securityElementPrompt);
return signature;
}
4.4验证签名
验证签名值。
public boolean RSAVerify(byte[] mesg, byte[] sign) throws Exception {
String sendersPublicKeyAlgo = "RSA";
byte[] sendersEncodedPublicKey = kRSAPublicKey;
X509EncodedKeySpec pks = new X509EncodedKeySpec(sendersEncodedPublicKey);
KeyFactory kf;
kf = KeyFactory.getInstance(sendersPublicKeyAlgo);
PublicKey sendersPublicKey = kf.generatePublic(pks);
Signature signature;
signature = Signature.getInstance("SHA1withRSA");
signature.initVerify(sendersPublicKey);
signature.update(mesg, 0, mesg.length);
boolean signatureValid;
signatureValid = signature.verify(sign);
return signatureValid;
}
4.5加密
对字符串加密,生成密文。
public byte[] RSAEncrypt(String plainText) throws Exception {
byte[] bplainText = plainText.getBytes();
String keyAlgo = "RSA";
byte[] EncodedPublicKey = kRSAPublicKey;
X509EncodedKeySpec pks;
pks = new X509EncodedKeySpec(EncodedPublicKey);
KeyFactory kf = KeyFactory.getInstance(keyAlgo);
PublicKey publicKey = kf.generatePublic(pks);
byte[] cipherText = new byte[512];
Cipher cipher;
cipher = Cipher.getInstance(keyAlgo);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.doFinal(bplainText, 0, bplainText.length, cipherText, 0);
return cipherText;
}
4.6解密
对密文解密,生成原文。
public String RSADecrypt(byte[] cipherText) throws Exception {
byte[] myprivatekey = CLSBase64.decode("privatekey in pkcs8format");
Key key = new SecretKeySpec(myprivatekey, 0, myprivatekey.length, "RSA");
Cipher c2 = Cipher.getInstance("RSA");
c2.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = new byte[cipherText.length];
c2.doFinal(cipherText, 0, cipherText.length, decrypted, 0);
System.out.println("Decrypted String is:"
+ new String(decrypted).trim());
return new String(decrypted).trim();
}
5、总结
SATSA(JSR-177)标准定义了一套完整的加密服务,加固了在无线应用领域的安全性。但目前各厂家对此标准的支持程度各不相同。同时SATSA要求同智能卡配合,将证书,私钥保存在智能卡里以提高安全级别。在国内好像还没有WIM卡的应用,在SIM卡上运行PKI技术也还没有看到。在这方面还有很大的发展空间。
参考资料
l JSR-177标准说明
l The Security and Trust Services API for J2ME, Part 1
l The Security and Trust Services API (SATSA) for J2ME: The Security APIs
分享到:
相关推荐
它由Connected Limited Device Configuration (CLDC) 和 Mobile Information Device Profile (MIDP) 组成,提供了基础的运行环境和应用程序接口(API),使得开发者能够创建跨平台的移动应用,包括游戏。 在这款...
《J2ME程序设计——手机游戏与应用程序》是由谢晓勇和黄奇合著的一本专业书籍,主要探讨了如何利用Java 2 Micro Edition (J2ME) 平台进行手机游戏和应用程序的开发。J2ME是Java平台的一个子集,特别针对嵌入式设备和...
根据给定的信息,我们可以分析并总结出关于J2ME(Java 2 Micro Edition)手机游戏——俄罗斯方块的重要知识点。 ### J2ME简介 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备...
内含J2ME游戏源码 和 相关论文一篇 论文内容:第一章、开发平台与技术概述;第二章 J2ME及其体系结构概述; 第三章 手机游戏开发过程;第四章 程序的调试与运行;第五章 总结;致 谢;参考文献
J2ME API是开发者在这些平台上构建应用程序的核心工具集合。本手册《J2ME API CHM》详细阐述了J2ME的各种接口、类和方法,是开发者学习和参考的重要资源。 1. **基础框架** J2ME主要由配置(Configurations)和 ...
j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api j2me----api
J2ME作业2,界面上每秒钟在随机位置出现随机颜色的数字0—9 ,要求用户快速反应,按下按键,如果按对,加1分,错误减2分,不按减1分,初始5分,减到0分,提示用户输了,有两个command可以退出或者重玩。 PS:不是工程...
copy别人的 ,觉得那段网络接收和发送处理的不错,
M3G API是J2ME平台上的一个标准,它允许开发者创建在移动设备上运行的3D图形应用程序。JSR 184(Java Specification Request 184)定义了这个API,旨在为小型设备提供高效且易于使用的3D图形接口。 **M3G API** 是...
**J2ME(Java 2 Micro Edition)**是Java平台的一个子集,主要用于...总的来说,J2ME中文API为开发者提供了在嵌入式设备上开发强大而灵活的应用程序的能力,而中文文档则有助于国内开发者更便捷地理解和应用这些技术。
安全与信任服务API (SATSA) for J2ME为开发者提供了一套强大的工具集,用于构建安全可靠的应用程序。通过对关键特性的深入理解,开发者能够在资源受限的设备上实现高级别的安全保护。随着移动设备在社会生活中的作用...
J2ME提供JSR-82(Java API for Bluetooth Wireless Technology)来支持蓝牙功能。开发者需要了解如何创建蓝牙适配器,扫描附近的蓝牙设备,建立连接,以及通过蓝牙套接字进行数据传输。在蓝牙联网五子棋游戏中,这个...
J2ME API广泛应用于开发各种移动应用程序,如游戏、工具应用、企业级服务等。例如,早期的许多手机游戏都是基于J2ME开发的,因为其跨平台特性和相对较低的硬件需求。此外,还可以利用J2ME API实现如短信服务、网络...
总的来说,《JSR177-SATSA:J2ME的安全与信任服务API》为J2ME平台上的应用程序提供了一整套全面的安全服务。通过这套API,开发者可以轻松地在其应用程序中集成安全功能,保护用户的隐私和数据安全。同时,该规格文档...
在Java 2 Micro Edition (J2ME)环境中,开发移动应用时可能会涉及到播放声音的需求。J2ME 提供了 Mobile Media API (MMAPI) 来处理多媒体内容,包括音频。MMAPI 是MIDP (Mobile Information Device Profile) 1.0 的...
这个“J2ME手机应用项目开发实践”是一个深入探讨如何利用J2ME进行手机应用开发的资源包,包含了实际项目的源代码,为开发者提供了宝贵的参考和学习材料。 J2ME的应用框架主要由两部分构成:MIDP(Mobile ...
J2ME手机软件图形界面API
J2ME应用程序运行在KVM上,这是一个专为小型设备优化的虚拟机,它不支持完整的Java Class库,而是采用CLDC(Connected Limited Device Configuration)和MIDP(Mobile Information Device Profile)来提供必要的API...
"java基于J2ME的游戏开发——贪吃蛇论文" J2ME(Java 2 Micro Edition)は、近年来随着各种不同设备、尤其是移动通信设备的飞速发展而诞生的新的开发技术。J2ME 是Java平台的微型版,专门为资源有限的设备设计,...
**J2ME移动应用开发讲义** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,如移动电话、PDA和家用电器设计。它允许开发者创建在这些设备上运行的应用程序,提供了一种跨平台的解决...