- 浏览: 2114393 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
ratlsun:
想请教下uc最新版本在android4.2和4.3版本上是不是 ...
UC浏览器8.3 (for iPhone)设计理念.“無”为而设 -
gly0920sky520123:
很有用哦,谢谢
DOS命令大全(经典收藏) -
chenyu0748:
UC加油,花哥加油~
UC浏览器8.3 (for iPhone)设计理念.“無”为而设 -
cnliuyix:
LZ搞点更有层次的吧,介个一般工程里根本用不到这么简单的。Si ...
Android 设计一个可单选,多选的Demo -
gang4415:
rgz03407@163.com
JSR规范,系统参数测试大全
基于 Java 的 Web 服务和无线 Java 开发是 JavaOne 2002 的两个最突出的主题。它们代表普及计算领域中未来的后端和前端 Java 技术。
Web 服务是基于标准 XML 通信协议的松耦合的可互操作的软件组件。Web 服务的使用使供应商能够在其核心竞争力所在的特定市场中提供服务。然后,客户可以根据其不同需要,从多个供应商选择采购服务。这种便利意味着 Web 服务完全适合于为无线前端提供服务。无线信息设备的便利和动态本质允许移动用户利用模块化的且动态可重新配置的后端服务。
Java 平台可以在无线 Web 服务应用程序开发中扮演几个重要角色。在无线端,Java 2 Micro Edition(J2ME)为所有无线设备(从蜂窝电话到复杂的家用无线信息家电)提供了跨设备的兼容性、高级语言功能和大量库。J2ME 的一个关键组件是移动信息设备框架(Mobile Information Device Profile(MIDP)),它在蜂窝电话和低端 PDA 上定义 Java API 和运行时环境。由于庞大数量的低端设备,期望在将来能够广泛部署 MIDP。
从 Web 服务端,Java 2 企业版(J2EE)已经具有所有必需的 API 和库来处理 Web 服务 XML 消息。通过 Web 服务接口或网关,可以方便地将用 EJB 技术实现的核心 J2EE 功能、JDBC API 和 RMI API 用于外部世界。为了将这些特性集合起来并启用无线 Web 服务应用程序,还提出了 J2ME Web 服务规范,目前它在 Java Community Process(JSR 172)中。
无线 Web 服务中的安全性
虽然基于
Java 的无线 Web
服务在普及移动商业世界中有一个光明的前途,但当前技术仍不成熟。安全性仍是剩下待解决的问题之一。无线通信是无线电波拦截容易获取的目标,而无线设备几
乎没有任何计算能力来支持所有通信数据的强加密。此外,在后端,Web 服务运行在企业防火墙之外并使用开放消息传递协议来彼此交互。无线 Web
服务同样是易招受各种破解攻击的目标。已开发得很好的点对点安全性技术(如 SSL/TLS 和 HTTPS)不适合于多供应商、多中间 Web
服务网络拓扑图 — 重点必需集中在保护内容本身而不是传递内容的连接上。尽管面临新挑战,然而 Web
服务本身还是能用来增强移动商业安全性。新兴的 Web 服务安全性规范的出现使您能够将 Web 服务用作安全性实用程序。
在下面的段落中,我将讨论一种常用的安全性技术:数字签名。我将向您演示如何在 XML 消息中使用数字签名来保证端对端的数据完整性。我将应用一些示例来说明如何通过在无线端上使用流行的 J2ME/MIDP 平台并在后端上使用 JavaServer Pages(JSP)技术来实现 XML 数字签名。最后,我将讨论性能问题以及在当前 MIDP 设备上使用数字签名的可行性。MIDP 编程细节不在本文范围内;如果您需要复习一下,请参阅参考资料 一节。
使用数字签名保证数据完整性
让我们假设一
下,您是一位股票交易者,当您不在交易大厅时,使用蜂窝电话来跟踪股票价格变化。在上下班途中,您的电话提醒您正在监视的一只股票的价格已经跌入您的心理
最低价。现在,您应根据此提示买进它并利用此低价来赚一笔吗?在您采取任何行动之前,您必须绝对确保提示本身是可信的。如果竞争者可能拦截并更改消息(例
如,更改股票代码),那么他就可能引诱您买进弄错的股票,并将他的高价位股票抛给您。您如何知道消息在从监视服务到您电话的途中没有被篡改呢?
数据完整性确实是通信安全性的最重要方面之一。物理上安全的网络十分昂贵,而且并不覆盖范围很广的地理区域。如果您的业务必须依靠因特网才能通信, 那么您必须面对因特网本身几乎不提供安全性这一事实。因特网数据包在到达其目的地之前必须途经由非对话双方控制的多个路由器和主机。数据通信在无线因特网 上特别容易受到攻击。
及时出现的援救工具是公钥基础设施(PKI)和数字签名。(和 MIDP 编程一样,数字签名不在本文范围内;感兴趣的读者可以参考参考资料 一 节来获取更多信息。)概括地说,在 PKI 数字签名模式中,每一方都有两个密码术密钥:公钥,任何人都可以使用它,而私钥,是保密的,只有某个人本身可以使用。用私钥加密的消息只能由相应的公钥正 确解密。当发送方发送消息时,他可以将相同消息的私钥加密版以及他的公钥与该消息一起发送。接收方使用发送方的公钥来解密加密版本。如果它与明文消息匹 配,那么接收方可以知道该消息确实可信。该消息的私钥加密版用作完整性验证记号,我们将它称为“数字签名”。
因为原始消息可能相当长,而且生成和验证数字签名的公钥算法是资源密集的,所以发送方通常计算称为“摘要”的原始消息的短版本并且仅对该版本进行数 字形式的签署。摘要具有固定长度,它是任何长度的输入消息的单向散列;其计算速度非常快。接收方首先验证接收的消息是否产生正确摘要。如果该摘要不匹配, 则在执行任何公钥算法之前拒绝该消息。这可以有助于防止攻击造成堵塞,在这种攻击中,攻击者通过用伪造的公钥请求填斥服务器,以耗尽它的计算资源。
在大多数实际应用程序中,公钥本身由可信的权威部门进行数字签名,并成为“数字证书”来验证发送方的标识。不过,数字证书的处理不在本文范围内,所以在下列示例中,我将假设发送方是可信的并使用未签署的公钥来说明方法。
定义的 XML 数字签名
正如我早先提到的
那样,XML 正成为 Web 服务世界中一个主要的数据交换协议。驱动 Web 服务的 XML
消息在到达目的地之前,通常需要经过多个中间环节。因此,我们保护从端到端的通信内容是重要的。完成这一任务的最好方法是,将 XML
文档及其安全性信息(如签名、摘要和密钥等等)都装运在一起,作为单个文档。
XML 数字签名是将数字签名添加到 XML 文档的 W3C 规范。发送方可以选择对整个文档或者仅它的一部分进行数字签名。数字签名、摘要和公钥被格式化成 XML 元素。那些安全性信息的额外元素可以封装整个原始 XML 消息,或者可以将它们嵌入原始消息。为了方便起见,我将在本文中使用封装格式。
为了清晰起见,我在本文中使用的 XML 数字签名示例并不完全与 W3C 相符。例如,我省去了标准(XML 标记的标准化)部分,因为它仅确保 XML 文档的一致性而与安全性本身无关。另外,我将密钥分成几个参数并将那些参数传递到公钥元素 KeyInfo
下的单独 XML 元素中,以代替使用编码的公钥证书。这在密钥和处理它们的 Java 代码之间建立了更明显的连接。
处理 MIDP 应用程序中的 XML 数字签名
IBM
alphaWorks 开发了一种称为 XML Security Suite 的 Java 包,它支持最新的 XML 数字签名规范。JSR
105 是标准化一组 Java API 以处理 XML 数字签名的一项社区成果。然而,它们仅作用于 Java 2
标准版(J2SE),这意味着可以在服务器端上使用 XML Security Suite 或 JSR 105 Java XML 数字签名
API,但不能在 MIDP 无线设备端上使用它们。
要处理 XML 数字签名,正在使用的无线设备需要支持下列功能:
- 对 XML 文档读写数据
。在示例 MIDP 应用程序中,kXML 解析器将 XML 文档和元素解析成 Java 对象(请参阅参考资料
)。除了 kXML 外,还有几个可在不同许可证条款下使用的其它 MIDP XML 解析器。
- 签署消息并验证签名 。这些功能需要一个不属于当前 MIDP 1.0 规范的密码术 API。
在下一节中,我将讨论一种轻量级 Java 密码术包,您可以在服务器端和无线 MIDP 设备端上使用它来生成并验证 XML 数字签名。
Bouncy Castle Crypto API
Bouncy
Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。因为
Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP
上运行的唯一完整的密码术包。
不管 Bouncy Castle 包的功能有多强大,它有一个主要问题:缺少文档。不存在在线文档,其 JavaDoc 写得并不好。与许多其它高级密码术包相似,Bouncy Castle 包广泛使用类型多态性来将常规概念与实现算法分开。对于初学者来说,辨认类之间的关系以及方法参数和返回值的正确类型是很困难的。通常,开发人员必须浏览 一下源代码和测试用例来研究做事的正确方法。显然,Bouncy Castle 包的指南非常合适。
在本文的其余部分,我们将简略地论述 XML 数字签名规范以及几个不同 Bouncy Castle 密钥生成器、编码引擎、数字签名签名引擎和摘要引擎的用法。
合在一起
到目前为止,我们已经讨论了许多技术和概念。下面,我将说明完整过程:密钥生成、在服务器端签署文档、以安全的 XML 格式编码和传送文档以及在客户机端验证文档。
- 服务器使用一组密钥模型参数生成由一个随机公钥和一个私钥组成的密钥对。在实际生产系统中,这个步骤通常不是必需的,因为密钥对通常是预先生成的并存储在服务器密钥库中。
- 访问 JSP 页时,服务器计算响应消息的摘要。
- 然后,JSP 页以“签署”方式调用签名引擎,并使用私钥为摘要生成数字签名。
- 服务器将签名信息(包括摘要、数字签名本身和公钥参数)嵌入 XML 响应消息中。
- 客户机接收 XML 文档并将摘要、数字签名和公钥参数解析成 Java 应用程序数据。
- 客户机计算来自明文消息的摘要并将它与服务器的摘要进行比较。如果两个摘要不匹配,则文档验证失败;如果它们匹配,则转至下一步。
- 客户机使用嵌入的密钥参数重新构造公钥。
- 客户机以“验证”方式调用签名引擎,并传递摘要、签名和公钥来验证签名。
在接下来的几节中,我们将遵循这些步骤来实现几个示例。因为我们的示例在服务器端和客户机端使用相同的 Bouncy Castle Crypto API,所以很容易更改它们以在无线设备上签署消息并在服务器端验证它。
处理摘要
正如我早先提到的那样,为了改进性能并避免攻击造成堵塞,您实际上签署的是消息摘要而不是消息本身。清单 1 说明了如何使用 SHA1Digest
摘要引擎来计算来自一段文本消息的已编码的摘要。
|
在下几节中,我们将了解如何使用 Bouncy Castle 的 DSA、ECC 和 RSA 签名引擎来签署并验证数字签名。那些签名引擎使用不同的算法和不同的密钥,并且需要不同的参数。我们还将讨论如何将安全性信息(签名、摘要和公钥)嵌入 XML 文档。最后,我将比较三个签名引擎并提出今后的改进建议。
DSA 签名示例
方法 DSASigUtil.generateKeys()
生成密钥对。正如我讨论过的那样,这个步骤通常由中央认证中心在脱机状态下完成,如清单 2 所示:
|
生成的公钥以参数 Y
来描述,并且用 pubKey.getY()
方法来检索它。参数 G
、P
和 Q
描述模型。类 DSAUtil
中的下列方法检索模型和密钥参数,它们是重新构造公钥对象所必需的:
|
通过使用生成的私钥,实用程序类 DSASigUtil
可以从摘要获取两部分 DSA 签名 R
和 S
:
|
服务器将摘要、签名和密钥参数编码成 ASCII 文本格式并以 XML 数字签名格式嵌入该文本,如清单 5 所示:
|
验证 MIDP 应用程序从 XML 文档解析出摘要、密钥参数和签名,重新构造公钥并使用下列方法来验证签名:
|
椭圆曲线 DSA 签名示例
在 ECDSASigUtil
类中,首先定义您计划使用的椭圆曲线模型,如清单 7 所示:
|
ECDSASigUtil.generateKeys()
方法使用清单 7 中的模型生成随机的密钥对。正如前面提到的那样,这个步骤通常由中央认证中心在脱机状态下完成。
|
公钥以参数 Q
来描述,并且用 pubKey.getQ()
方法来检索它。为了避免与模型参数 q
产生混淆,在方法中使用 QQ
,XML 元素名使用大写的 Q
。清单 9 显示了 ECDSAUtil
类中的方法。这些方法检索模型和密钥参数,它们是重新构造公钥对象所必需的。
清单 9. 用于检索模型和密钥参数的 ECDSAUtil 方法
|
通过使用生成的私钥,实用程序类 ECDSASigUtil
可以从摘要获取两部分 DSA 签名 R
和 S
:
|
服务器将摘要、签名和密钥参数编码成 ASCII 文本格式并以 XML 数字签名格式嵌入该文本。和检索方法名中一样,公钥参数 Q
被记录为 QQ
,以将它与相应 XML 元素中的密钥参数 q
区分开来,如清单 11 所示:
|
验证 MIDP 应用程序从 XML 文档解析出摘要、密钥参数和签名,重新构造公钥并使用清单 12 中显示的方法来验证签名:
|
RSA 签名示例
RSA 算法只有一个模型参数 Exponent
:
|
RSASigUtil.generateKeys()
方法使用 Exponent
生成随机的密钥对。同样,这个步骤通常由中央认证中心在脱机状态下完成。
|
公钥以参数 Modulus
来描述,并且用 pubKey.getModulus()
方法来检索它。清单 14 显示了 RSAUtil
类中的方法。这些方法检索 Exponent
和 Modulus
、模型以及密钥参数,它们是重新构造公钥对象所必需的。
清单 14. 用于检索模型和密钥参数的 RSAUtil 方法
|
通过使用生成的私钥,实用程序类 RSASigUtil
可以从摘要获取一个字节数组 RSA 签名:
|
服务器将摘要、签名和密钥参数编码成 ASCII 文本格式并以 XML 数字签名格式嵌入该文本:
|
验证 MIDP 应用程序从 XML 文档解析出摘要、密钥参数和签名,重新构造公钥并使用下列方法来验证签名:
|
性能问题
我的测试说明了无线设备上的 XML 解析和摘要生成都非常快。正如预料的那样,主要的性能瓶颈是公钥算法的速度很慢。
Bouncy Castle Crypto 包提供几个使用 DSA、RSA 和 ECC 算法的签名引擎类来签署和验证消息。但在实际设备中,它们并不都是实用的。因为 Bouncy Castle Crypto 包完全基于Java 语言,所以它在没有特殊优化的情况下依靠很慢的 JVM 来执行甚至是最密集的大整数数学运算。
结果,只有 RSA 算法提供了一个合理的性能,而且是勉强接受的。它只要花一分多钟就可以在 16MHz Palm VII 设备上验证具有 1024 位公钥的简单数字签名。通过选择较弱的密钥可以改进性能。但虽然如此,验证进程在任何实际的应用程序中还是必须作为后台线程运行,以避免用户界面锁定。
DSA 和 ECC 算法性能在其当前实现中是完全不可接受的。具有 1024 位密钥的 DSA 签名和具有 192 位密钥的 ECC 签名要花一个多小时在标准的 Palm VII MIDP 上进行验证。
性能问题强烈暗示我们需要为大整数数学运算和公钥算法对 JVM 进行优化。JVM 还必须利用可用的特殊硬件和底层的 OS
功能来促进与安全性相关的数学运算。公钥算法用于安全连接(如 HTTPS)中的信息交换。许多当前的 MIDP VM 可以用合理的性能来支持
HTTPS 协议。MIDP4Palm VM 可以利用 Palm OS 的底层的 inethttps
协议来建立安全连接。可以想象未来的 VM 和核心语言库不仅优化与安全连接相关的公钥操作,而且还使优化可用于一般安全性功能(如数字签名)。
结束语
在本文中,您学习了安全性
在无线 Web 服务中的重要性并说明了在无线和 Web 服务端处理 XML 数字签名的技巧。我使用了 Bouncy Castle Java
密码术包的纯 Java 实现来处理数字签名。在 Bouncy Castle 提供的所有算法中,只有 RSA
算法提供了无线设备上可勉强接受的性能。然而,未来在 MIDP 运行时环境上的进步可以使数字签名更易于移动用户使用。
<noscript src="http://media.yesky.com/adjs/column/yesky-inner-js-1.js"></noscript>
发表评论
-
汉字点阵字库原理
2011-01-28 10:09 3387一、 汉字编码 1. ... -
如何通过改jad和Manifest把其它手机的java游戏改成N830的
2011-01-25 10:21 1361首先要明确一点,不是所有的游戏都能改的。 <200 ... -
索爱手机IMSI序列号获取
2011-01-20 11:29 1963国际移动用户识别码(I ... -
J2ME数组的复制及连接操作
2010-11-19 10:47 1272public class Arrays { /** ... -
手机 J2ME MIDP 性能测试工具(MIDP BenchMark)
2010-11-19 10:35 1463JavaME Test Suitehttp://www.dog ... -
SocketConnection 参数详细介绍
2010-03-23 11:34 2135请大家看下面的代码: len = is.read(gDat ... -
J2ME使用Socket通过cmwap接入点访问安全HTTPS
2010-03-17 16:36 484这个问题是在我升级J2ME版XHTML浏览器的时候被引入的 ... -
一些很特别的J2ME开源项目(转
2010-03-11 09:43 2362StrutsME 一个轻量级的序列化协议,使J2ME客户端能调 ... -
WMLC 检查charset编码
2009-12-16 15:27 180http://www.iana.org/assignments ... -
Eclipse快捷键
2009-12-01 10:38 1418编辑相关快捷键 Eclipse的编辑功能非常强大,掌 ... -
改善你的J2ME程序界面-使用开源UI库
2009-09-03 16:45 3705J2ME自带UI不是太美观,使用起来也不太方面,为了解决这 ... -
LZW数据压缩算法的原理分析【转】
2009-08-05 19:31 2574转一篇好文章, 原文地址:http://www.cnblog ... -
<a> 标签,target="blank",target="_blank" 的区别。
2009-05-27 13:00 11560在编写html代码的时候。 target="bla ... -
贡献 高效的MIDlet 编程
2009-05-23 15:32 1902从网上找到这本资料。 是E文版的。 大家顺便锻炼下E文 -
How to use pop-up TextBox in Java ME
2009-05-23 13:44 1774Overview One of the Displayabl ... -
How to use freely resizable font in in Java ME
2009-05-23 13:41 1337Contents [hide] 1 Overview 2 ... -
A Simple Ordered Hashtable
2009-05-23 12:08 1564This article illustrates how to ... -
开发NokiaS40系列应用程序初级篇
2009-05-22 18:56 1721本文讲述如何搭建Nokia S40系列手机应用程序的开发环境 ... -
索尼爱立信手机在 J2ME 程序中的字体大小
2009-05-18 16:25 1349之前有朋友问到索尼爱立信手机在 J2me 程序中的字体大小,请 ... -
If-Modified-Since & If-None-Match
2009-05-13 11:01 14555google告诉网站站长:您 ...
相关推荐
MIDP 是 J2ME 中的一个关键组件,提供了创建移动应用程序的框架和 API,使得开发者可以为移动设备编写功能丰富的应用。 `com/sun/midp/jadto` 这个标签暗示了源代码可能包含 JAD (Java Application Descriptor) ...
MIDP(Mobile Information Device Profile)是J2ME的一部分,它定义了用于创建移动设备上的交互式应用程序的API。在本案例中,我们讨论的是MIDP 2.0版本,这是对MIDP 1.0的一个重大升级,提供了更多的功能和改进。 ...
摘要图形图像的旋转在移动应用程序开发,特别是游戏开发过程中有着现实的需求。但J2ME对此提供的支持却十分有限,如MIDP2.0仅支持图像成90度整数倍的旋转。针对这种情况,本文提出了一种实现图像任意角度旋转的方案...
7. 生命周期管理:MIDlet类是所有MIDP应用的基础,它定义了应用的生命周期方法,如startApp()、pauseApp()和destroyApp()。 通过研究这个源代码包,开发者可以学习到如何有效地利用MIDP 2.0 API创建移动应用,理解...
1. **MIDP API**:这是开发J2ME应用程序的关键,它提供了基本的用户界面组件(如表单、按钮等)和网络功能。MIDP API还包含了CLDC(Connected Limited Device Configuration),一个针对内存和处理能力有限的设备的...
它包括一套精简的Java API,如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration),使得开发者能够创建在这些小型设备上运行的应用程序。 J2EE,另一方面,是用于开发和...
1. **JSR扩展**:Java Specification Requests (JSRs) 提供了额外的API,如JSR 118(游戏API)、JSR 135(Java 3D for J2ME)等,可增强MIDP应用的功能。 2. **安全与隐私**:MIDP提供了安全框架,允许开发者对数据...
在IT行业中,J2ME(Java 2 Micro Edition)是一个重要的平台,主要用于开发移动设备上的应用程序,如手机、智能手表等。MIDP(Mobile Information Device Profile)是J2ME的一部分,它为移动设备提供了基本的用户...
MIDP应用程序通常被称为MIDlets,它们是运行在MIDP环境下的Java应用程序。MIDlet由一个或多个类组成,其中主类必须实现MIDlet接口,并包含生命周期方法,如startApp()、pauseApp()和destroyApp()。 **4. 用户界面**...
- **MIDP**:是J2ME的一部分,定义了移动信息设备的用户界面和应用程序接口。KSOAP在这个平台上运行,使得受限的移动设备也能进行复杂的网络通信。 **3. JAVADOC文档的重要性:** - **API参考**:JAVADOC文档详细列...
**使用Ant和Antenna开发MIDP应用程序** MIDP(Mobile Information Device Profile)是Java Micro Edition (JME)的一部分,用于开发在移动设备和嵌入式系统上运行的应用程序。Ant是Apache软件基金会的一个开源项目,...
综上所述,基于J2ME平台的手机应用程序开发涉及了从基础的J2ME架构理解,到具体的MIDP组件使用,再到开发工具的选择和应用发布流程。开发者需要掌握这些核心概念和技术,才能有效创建出能在多种手机平台上运行的高效...
3. **Mobile Information Device Profile (MIDP)**:MIDP是J2ME针对移动设备的应用程序接口,主要应用于开发移动电话上的Java应用。它定义了用户界面、网络通信和数据存储等方面的标准,使得开发者可以创建具有图形...
介绍如何用MIDlet套件进行j2me应用程序开发
MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了在这些小型设备上开发应用程序的基本框架和API。本教程将深入探讨如何使用J2ME和MIDP2.0进行移动应用开发。 **1. J2ME架构** J2ME...
MIDP(Mobile Information Device Profile)是J2ME的一部分,提供了创建移动应用程序,特别是游戏的基础框架。MIDP 2.0版本带来了许多改进,包括更丰富的用户界面组件、更强大的图形处理能力和对多媒体的支持,使得...
MIDP(Mobile Information Device Profile)2.0是J2ME的一部分,提供了一个基础框架,用于构建移动设备上的应用程序,特别是那些功能相对简单的手机游戏和实用工具。在这个“图像处理演示程序”中,我们主要关注的是...
开发J2ME MIDP应用程序,通常使用的是Sun Microsystems(现为Oracle)提供的Java Wireless Toolkit (WTK)。WTK包括一个模拟器,开发者可以在这个模拟器上运行和测试MIDlets,以及一系列的开发和调试工具。 **MIDP...