当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > JAVA > J2ME > 正文

保护您的 J2ME/MIDP 应用程序(4)

http://www.zk168.com.cn  招考学习网 2006-4-11 3:21:51
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
保护您的 J2ME/MIDP 应用程序(4)

公钥以参数 Modulus 来描述,并且用 pubKey.getModulus() 方法来检索它。清单 14 显示了 RSAUtil 类中的方法。这些方法检索 Exponent 和 Modulus 、模型以及密钥参数,它们是重新构造公钥对象所必需的。 清单 14. 用于检索模型和密钥参数的 RSAUtil 方法
// Public key specific parameter.
public static String getMod() throws Exception {
return (new String(Base64.encode(pubKey.getModulus().toByteArray())));
}
// General key parameter. pubExp is the same as pubKey.getExponent()
public static String getPubExp() throws Exception {
return (new String(Base64.encode(pubExp.toByteArray())));
}

通过使用生成的私钥,实用程序类 RSASigUtil 可以从摘要获取一个字节数组 RSA 签名:

清单 15. 获取字节数组 RSA 签名
static public String getSignature (String mesg) throws Exception {
SHA1Digest digEng = new SHA1Digest();
RSAEngine rsaEng = new RSAEngine();

PSSSigner signer = new PSSSigner(rsaEng, digEng, 64);
signer.init(true, privKey);

byte [] sig = signer.generateSignature( mesg.getBytes() );
String result = new String( Base64.encode(sig) );
return result;
}

服务器将摘要、签名和密钥参数编码成 ASCII 文本格式并以 XML 数字签名格式嵌入该文本:

清单 16. 编码并以数字签名格式嵌入
<SignedMesg>
<mesg>Hello World</mesg>
<Signature>
<SignedInfo>
<SignatureMethod Algorithm="rsa-sha1" />
<DigestValue>Ck1VqNd45QIvq3AZd8XYQLvEhtA=</DigestValue>
</SignedInfo>
<SignatureValue>
IhJ/UMitJX7sWbzhnG8UKIdDYiZ0mfOUoAwemGiG08C
WcQ3cUszgJXoIclHW/LN7w54w2FQyLStB+hPKASEC6r
OjjgTBs6pwhjHCh2XxWx7hS7fdi9/Qk/ybH6xYGaeaZ
3oHDBjFz3hEDtrvBYcHn3keCavncE22idRX7kBl8Do=
</SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus>
AKT1SyxSm4uT1zYWEPY9IaFY7vDhpkIM7FZeIQ
OGnKeSEE5d3sPfONkCiHfO2oe4x6jNCXg/ngRi
tmixBkjfKgHzF4trZZtNQZjfzAgcXGljzp9MD2
ZEWQbHKvMZvZyJVrT2SlxLzusxWLwXdacprIDG
bqDAmldBOBpkmrUdPpF9
</Modulus>
<Exponent>EQ==</Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>
</SignedMesg>

验证 MIDP 应用程序从 XML 文档解析出摘要、密钥参数和签名,重新构造公钥并使用下列方法来验证签名:

清单 17. 验证签名
static public boolean verify (String mesg, String signature,
String mod, String pubExp) {

BigInteger modulus = new BigInteger( Base64.decode(mod) );
BigInteger exponent = new BigInteger( Base64.decode(pubExp) );

SHA1Digest digEng = new SHA1Digest();
RSAEngine rsaEng = new RSAEngine();

RSAKeyParameters pubKey = new RSAKeyParameters(false, modulus, exponent);

PSSSigner signer = new PSSSigner(rsaEng, digEng, 64);
signer.init(false, pubKey);

boolean res = signer.verifySignature( mesg.getBytes(),
Base64.decode(signature) );
return res;
}

性能问题
我的测试说明了无线设备上的 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 运行时环境上的进步可以使数字签名更易于移动用户使用。

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文 .
  • 下载本文中示例的 样本代码 。
  • Michael Yuan 和他的合著者 Ju Long 集中讨论了 J2ME/MIDP 平台的一般安全性问题 ( developerWorks ,2002 年 6 月),可从 developerWorks 无线专区获得该篇文章。
  • 在“ J2ME grows up ”( developerWorks ,2001 年 5 月)中,Todd Sundsted 演示了 J2ME 如何向开发人员提供在各种各样的设备上利用其技能的方法。
  • 在“ Make your software behave: Cryptography essentials ”( developerWorks ,2000 年 7 月)中,安全性专家 Gary McGraw 解释了安全散列和数字签名的基本知识。
  • IBM alphaWorks XML Security Suite 支持最新的 XML 数字签名和其它安全 XML 协议。
  • 请查找由 Larry Loeb 编写的一篇综合性文章( developerWorks ,2001 年 12 月)中有关 XML 数字签名 的更多信息。
  • 请阅读 W3C XML 数字签名标准 。
  • 要处理服务器端 Java 平台上的 XML 数字签名,请查阅这个提出的 Java XML 数字签名 API 。
  • J2ME Web 服务规范 提出了处理 J2ME 平台上的 XML 消息和 Web 服务 XML-RPC 的 API。
  • JavaOne 2002 会议集中讨论 Web 服务和无线应用程序。在“ JavaOne 2002: Top innovations ”( developerWorks ,2002 年 3 月)中,Govind Seshadri 对他所倡导的创新进行了总结。
  • 在“ Security in a Web Services World: A Proposed Architecture and Roadmap ”( developerWorks,2002 年 4 月 )中,IBM 和 Microsoft 提出了解决 Web 服务环境中安全性的策略和模型。
  • 本文使用 kXML 解析器来解析示例中的 XML 文档。
  • Bouncy Castle Crypto 轻量级密码术包运行在 J2SE 和 J2ME/MIDP 平台上。
  • 大多数 Bouncy Castle 算法实现直接来自 CRC Press 出版社 1996 年出版的由 Alfred J. Menezes、Paul C. Van Oorschot、Scott A. Vanstone 编著的 Handbook of Applied Cryptography 一书。
  • 这个 对照表 强调了 DSA、RSA 和 ECC 算法的密码术强度和性能。
  • 请查找 developerWorks Java 技术专区 上的其它 Java 编程参考资料。
关于作者

Michael J. Yuan 是德州大学奥斯汀分校的博士研究生。他对使用 Java 技术来促进科学教育和研究很感兴趣。可以通过 juntao@mail.utexas.edu 与他联系。
(全文完)
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>