`
peterwanghao
  • 浏览: 128384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

J2ME安全应用——Bouncy Castle Crypto API

 
阅读更多

1、前言

随着移动商业的不断发展,对于移动用户和无线应用程序开发人员而言,安全性正在成为一个重要方面。无线通信是无线电波拦截容易获取的目标,而无线设备几乎没有任何计算能力来支持所有通信数据的强加密。而目前开发得很好的点对点安全性技术(如 SSL/TLS HTTPS并不适合于多供应商、多中间 Web 服务网络拓扑图。因此重点必须集中在保护内容本身而不是传递内容的连接上。

本文将讨论使用一种常见的安全性技术:数字签名。数字签名可以满足网络通讯安全的四方面标准:

可认证性:通信双方必须标识其本身。公钥证书上的数字签名可以验证该公钥的可靠性以及持有它的那一方的可靠性。

数据完整性:通信双方必须确保内容在传送期间不被改变。数字签名是保证数据完整性的最常用技术。

数据机密性:有时候,通信数据是敏感的,必须保密。数字签名不提供数据机密性。我们必须使用数据加密。

不可抵赖性:消息发送之后,发送方随后应该不能否认它。数字签名提供了部分解决方案。如果以数字方式对消息进行签名,则发送方无法否认其责任,因为只有他能提供这种签名。

2j2me安全机制简介

J2ME 平台是由配置(Configuration)和简表(Profile)构成的。配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java 虚拟机。简表是针对一系列设备提供的开发包集合。在J2ME 中还有一个重要的概念是可选包(Optional Package),它是针对特定设备提供的类库。

目前,J2ME 中有两个最主要的配置,分别是Connected Limited Devices ConfigurationCLDC)和Connected Devices ConfigurationCDC)。他们是根据设备的硬件性能进行区分的,例如处理器、内存容量等。CLDC 主要针对那些资源非常受限的设备比如手机、PDA、双工寻呼机等。而CDC 主要面对那些家电产品,比如机顶盒、汽车导航系统等。简表是以配置为基础的,例如Mobile Information Devices ProfileMIDP)就是CLDC 上层的重要简表。

CLDC规范定义了3个级别的安全机制:底层安全机制,应用级别安全机制和端对端的安全机制。在这里有一点需要强调的是字节码验证过程。JVM 提供了防止恶意代码进入企业系统的服务,字节码验证过程保证了应用程序不能访问内存空间或使用其域外的资源。字节码验证还防止应用程序重载 Java 语言核心库,这是一种可以用来绕过其它应用程序级安全性措施的方法。但是,由于这种操作高昂的计算开销,MIDP VM 不在运行时执行完整的字节码验证,而是增加了预审和机制。要求应用程序开发人员必须在把应用程序部署到移动设备中之前,在开发平台上预先验证类。预验证过程优化执行流,创建应用程序中包含指令目录的堆栈映射(stackmap),然后将堆栈映射添加到经预验证的类文件。在运行时,MIDP VM 迅速地对字节码进行线性扫描,将每个有效的指令与合适的堆栈映射项相匹配。

此外在MIDP2.0中规定了许可和保护域概念。应用程序通过对敏感API 提出许可申请来试图获得相应的权限。提供了信任域与非信任域,不同的设备提供的保护域可能是不同的,一般我们开发的MIDlet都是存放到非信任域的。如果想成为可信任的MIDlet需要想一个可信任的组织提出认证申请。

关于更多详细的内容可以参看www.j2medev.com撰写的《j2me中文教程》,里面有对j2me安全机制的详细介绍。

3Bouncy Castle Crypto API

<place w:st="on"><placename w:st="on"><span lang="EN-US" style="">Bouncy</span></placename><span lang="EN-US" style=""> <placetype w:st="on">Castle</placetype></span></place> 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.2.1</chsdate>的实现。因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。

不管 Bouncy Castle 包的功能有多强大,它有一个主要问题:缺少文档。不存在在线文档,其 JavaDoc 写得并不好。与许多其它高级密码术包相似,Bouncy Castle 包广泛使用类型多态性来将常规概念与实现算法分开。对于初学者来说,辨认类之间的关系以及方法参数和返回值的正确类型是很困难的。通常,开发人员必须浏览一下源代码和测试用例来研究做事的正确方法。

由于移动设备自身的特点,对应用程序大小要求比较严格。建议在使用Bouncy Castle包时只把需要的源代码引入到自己的工程中,一起编译打包。在运行前使用混淆器将class文件混淆下。虽然在很多资料介绍中说混淆过程是一个可选过程,但我在实际开发过程中发现如果不进行混淆,运行程序会报错:Uncaught exception java/lang/NoClassDefFoundError: java/math/BigInteger: Cannot create class in system package 。使用混淆器的好处是减少class文件的透明度和减少程序的大小。

常见的混淆器见下表(此表数据来源于《j2me中文教程》):

名称

地址

特点

JODE

http://jode.sourceforge.net/

开源

ProGuard

http://proguard.sourceforge.net/

开源

RetroGuard

http://www.retrologic.com/

开源,中国移动百宝箱

强制使用

DashO

http://www.preemptive.com/

商业软件,一般专业公

司使用,昂贵

ZKM

http://www.zelix.com/

商业软件可试用

JBuilder

http://www.borland.com/

集成开发环境中内附混

淆功能,但JBuilder

的价格也不便宜。

4、示例代码

4.1生成密钥对

使用RSA算法,生成1024位长密钥对。

public void generateRSAKeyPair () throws Exception {

RSAPrivateCrtKeyParameters RSAprivKey = null;

RSAKeyParameters RSApubKey = null;

SecureRandom sr = new SecureRandom();

BigInteger pubExp = new BigInteger("10001", 16);

RSAKeyGenerationParameters RSAKeyGenPara =

new RSAKeyGenerationParameters(pubExp, sr, 1024, 80);

RSAKeyPairGenerator RSAKeyPairGen = new RSAKeyPairGenerator();

RSAKeyPairGen.init(RSAKeyGenPara);

AsymmetricCipherKeyPair keyPair = RSAKeyPairGen.generateKeyPair();

RSAprivKey = (RSAPrivateCrtKeyParameters) keyPair.getPrivate();

RSApubKey = (RSAKeyParameters) keyPair.getPublic();

}

4.2签名

对字节数组签名。

public byte[] RSASign(byte[] toSign, CipherParameters RSAprivKey)

throws Exception {

if (RSAprivKey == null)

throw new Exception("Generate RSA keys first!");

SHA1Digest dig = new SHA1Digest();

RSAEngine eng = new RSAEngine();

PSSSigner signer = new PSSSigner(eng, dig, 64);

signer.init(true, RSAprivKey);

signer.update(toSign, 0, toSign.length);

return signer.generateSignature();

}

4.3验证签名

验证签名值。

public boolean RSAVerify(byte[] mesg, byte[] sig, CipherParameters RSApubKey)

throws Exception {

if (RSApubKey == null)

throw new Exception("Generate RSA keys first!");

SHA1Digest dig = new SHA1Digest();

RSAEngine eng = new RSAEngine();

PSSSigner signer = new PSSSigner(eng, dig, 64);

signer.init(false, RSApubKey);

signer.update(mesg, 0, mesg.length);

return signer.verifySignature(sig);

}

4.4加密

对字符串加密,生成密文。

public byte[] RSAEncrypt(String plainText ,CipherParameters RSApubKey)

throws Exception {

byte[] rv = null;

AsymmetricBlockCipher eng = new RSAEngine();

eng.init(true, RSApubKey);

byte[] ptBytes = plainText.getBytes();

rv = eng.processBlock(ptBytes, 0, ptBytes.length);

return rv;

}

4.5解密

对密文解密,生成原文。

public String RSADecrypt(byte[] cipherText, CipherParameters RSAprivKey)

throws Exception {

byte[] rv = null;

AsymmetricBlockCipher eng = new RSAEngine();

eng.init(false, RSAprivKey);

rv = eng.processBlock(cipherText, 0, cipherText.length);

return new String(rv).trim();

}

4.6证书解析

der证书,获取证书信息。

public void ShowCert(byte[] cert) throws Exception {

ByteArrayInputStream bIn;

ASN1InputStream aIn;

bIn = new ByteArrayInputStream(cert);

aIn = new ASN1InputStream(bIn);

ASN1Sequence seq = null;

seq = (ASN1Sequence) aIn.readObject();

X509CertificateStructure obj = new X509CertificateStructure(seq);

TBSCertificateStructure tbsCert = obj.getTBSCertificate();

int version = tbsCert.getVersion();

String subject = tbsCert.getSubject().toString();

String issuer = tbsCert.getIssuer().toString();

long serial = tbsCert.getSerialNumber().getValue().longValue();

String sign = tbsCert.getSignature().getObjectId().getId();

// X509 Extensions

X509Extensions ext = tbsCert.getExtensions();

if (ext != null) {

Enumeration en = ext.oids();

while (en.hasMoreElements()) {

DERObjectIdentifier oid = (DERObjectIdentifier) en

.nextElement();

X509Extension extVal = ext.getExtension(oid);

}

}

}

5、总结

Bouncy Castle功能强大,支持大量的密码算法。特别是提供在MIDP上对证书应用的处理接口,能够满足在移动设备上证书应用的需求。不足之处是其文档太过简单,对类之间关系和参数含义理解困难,需要去阅读其原码。在性能方面,主要的瓶颈是公钥算法的速度比较慢。我在WTK2.5上生成1024位的RSA密钥需要用时2分钟左右。

参考资料

<!--[if !supportLists]-->l <!--[endif]-->The <place w:st="on"><placename w:st="on">Bouncy</placename><placetype w:st="on">Castle</placetype></place> project

http://www.bouncycastle.org/

<!--[if !supportLists]-->l <!--[endif]-->j2me中文教程

J2ME开发网(www.j2medev.com

<!--[if !supportLists]-->l <!--[endif]-->Data security in mobile Java applications

http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html?page=1

分享到:
评论

相关推荐

    org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包

    org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包

    bouncycastle集合包

    它提供了大量的加密算法、协议实现以及证书处理功能,是开发安全应用的重要工具。在这个集合包中,我们找到了四个不同版本的BouncyCastle相关jar文件,分别如下: 1. **bcprov-jdk16-1.46.jar**:这是BouncyCastle...

    bouncy castle .jar包

    bouncy castle(轻量级密码术包)是一种用于 Java 平台的开放源码的轻量...因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。

    j2me手机游戏——扫雷

    它由Connected Limited Device Configuration (CLDC) 和 Mobile Information Device Profile (MIDP) 组成,提供了基础的运行环境和应用程序接口(API),使得开发者能够创建跨平台的移动应用,包括游戏。 在这款...

    J2ME程序设计——手机游戏与应用程序PDF(谢晓勇,黄奇).rar

    《J2ME程序设计——手机游戏与应用程序》是由谢晓勇和黄奇合著的一本专业书籍,主要探讨了如何利用Java 2 Micro Edition (J2ME) 平台进行手机游戏和应用程序的开发。J2ME是Java平台的一个子集,特别针对嵌入式设备和...

    Bouncy Castle Java 发行版(镜像).zip

    Legion 和此包的最新动态可在https://www.bouncycastle.org上找到。Legion 还非常感谢其他人对此软件包的贡献(请参阅此处查看当前列表)。如果您想为我们的努力做出贡献,请随时与我们联系或访问我们的捐赠页面,...

    j2me手机游戏——俄罗斯方块!

    根据给定的信息,我们可以分析并总结出关于J2ME(Java 2 Micro Edition)手机游戏——俄罗斯方块的重要知识点。 ### J2ME简介 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备...

    J2ME手机游戏——贪吃蛇(含详细论文)

    内含J2ME游戏源码 和 相关论文一篇 论文内容:第一章、开发平台与技术概述;第二章 J2ME及其体系结构概述; 第三章 手机游戏开发过程;第四章 程序的调试与运行;第五章 总结;致 谢;参考文献

    j2me作业2——反应速度测试

    J2ME作业2,界面上每秒钟在随机位置出现随机颜色的数字0—9 ,要求用户快速反应,按下按键,如果按对,加1分,错误减2分,不按减1分,初始5分,减到0分,提示用户输了,有两个command可以退出或者重玩。 PS:不是工程...

    bc-java:Bouncy Castle Java发行版(镜像)

    Bouncy Castle Crypto软件包是加密算法的Java实现,它是由澳大利亚注册慈善机构Bouncy Castle军团开发的,几乎没有帮助! 可以在上找到该军团以及该软件包的最新动态。 军团还感激其他人为这一一揽子计划所做的...

    J2ME 中文api以及应用 J2ME 中文api以及应用.rar

    **J2ME(Java 2 Micro Edition)**是Java平台的一个子集,主要用于...总的来说,J2ME中文API为开发者提供了在嵌入式设备上开发强大而灵活的应用程序的能力,而中文文档则有助于国内开发者更便捷地理解和应用这些技术。

    J2ME 手机游戏——基于网络

    copy别人的 ,觉得那段网络接收和发送处理的不错,

    Bouncy Castle 的JCE运行包

    因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。 主要包括bcprov-ext-jdk16-145.jar和bcprov-jdk16-145.jar

    J2ME APICHM.zip_api j2me_j2me_j2me api c_j2me api chm_java api

    J2ME API是开发者在这些平台上构建应用程序的核心工具集合。本手册《J2ME API CHM》详细阐述了J2ME的各种接口、类和方法,是开发者学习和参考的重要资源。 1. **基础框架** J2ME主要由配置(Configurations)和 ...

    j2me源码——蓝牙联网实现五子棋

    《J2ME源码——蓝牙联网实现五子棋详解》 在移动开发领域,Java 2 Micro Edition(J2ME)是一种广泛应用于嵌入式设备和移动设备的Java平台,尤其在早期智能手机和平板电脑中占据重要地位。本文将深入探讨一个基于...

    J2ME-API.rar_j2me api

    J2ME API是J2ME的核心组成部分,为开发者提供了丰富的类库和接口,用于构建功能强大的移动应用程序。 1. **配置与Profile** J2ME的体系结构基于配置和Profile的概念。配置定义了Java虚拟机(JVM)的基本特性和内存...

    郭克华J2ME实例教程完整版之GAME API3

    《郭克华J2ME实例教程完整版之GAME API3》是一份专为初学者设计的J2ME游戏开发教程,以WMV视频格式呈现,图文并茂,旨在帮助学习者深入理解并掌握J2ME平台上的游戏编程技术。在这个教程中,郭克华老师详细讲解了J2ME...

    J2ME学习——如何播放声音

    在Java 2 Micro Edition (J2ME)环境中,开发移动应用时可能会涉及到播放声音的需求。J2ME 提供了 Mobile Media API (MMAPI) 来处理多媒体内容,包括音频。MMAPI 是MIDP (Mobile Information Device Profile) 1.0 的...

    J2ME手机应用项目开发实践

    这个“J2ME手机应用项目开发实践”是一个深入探讨如何利用J2ME进行手机应用开发的资源包,包含了实际项目的源代码,为开发者提供了宝贵的参考和学习材料。 J2ME的应用框架主要由两部分构成:MIDP(Mobile ...

    J2ME手机应用项目开发实践 源代码

    J2ME应用程序运行在KVM上,这是一个专为小型设备优化的虚拟机,它不支持完整的Java Class库,而是采用CLDC(Connected Limited Device Configuration)和MIDP(Mobile Information Device Profile)来提供必要的API...

Global site tag (gtag.js) - Google Analytics