Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 [转载]论Java加密技术与Windows的结合(1)
samuel





发贴: 50
积分: 10
于 2003-08-22 11:17 user profilesend a private message to usersend email to samuelsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
[转载自 ·独行客· http://www.yesky.com/20030429/1666178.shtml]

公共钥匙加密技术需要一个空间来存储数字证书和私钥。通过将钥匙和证书存储到一个文件中(称为keystore),Java Security Architecture实现了独立于平台的加密技术。

  Microsoft Windows把钥匙和证书存储到Windows注册表和文件系统中。这就是说,在Windows系统上运行安全的Java程序的用户必须在Java和Microsoft的钥匙和证书库之间输入和输出钥匙和证书。好消息是,你可以“哄骗”Java应用程序通过Microsoft本地函数来运用Microsoft的证书和钥匙库。

  通过将你的Java应用程序同Windows 钥匙/证书库结合起来,你虽然牺牲了平台独立性,但你得到了四个好处:减少了管理和支持的成本、更方便用户使用、更好的证书撤消校验、以及更好的钥匙和证书管理工具。

  一个Java程序必须通过四个不同的类实现与Windows加密术的集成: · TrustManager Provider:用这个类来实现与Windows证书库的集成并实现安全策略。

  · KeyManager Provider:用这个类来实现与Windows私钥库的集成。
  · RSA Signature Provider:数字签名需要访问私钥库。如果Java程序不能读取私钥(比如,如果私钥存在一个加密了的智能卡上了),那么签名操作就必须在Windows中进行。
  · RSA Cipher Provider:解密RSA加密的数据(如加密套接字协议层(SSL)对称的钥匙)需要访问私钥库。如果Java程序不能读取私钥(比如,如果私钥存在一个加密了的智能卡上了),那么RSA解密操作就必须在Windows中进行。

  我将讲述与Windows平台集成的TrustManager Provider、KeyManager Provider、RSA Signature Provider和RSA Cipher Provider的用法。TrustManager和KeyManager可以让你构建可运行的Windows支持的Java Secure Socket Extension(JSSE)应用程序。JSSE范例程序——EchoServer和EchoClient可以证明这一点。你不能覆盖JSSE的内置的RSA Cipher Provider,所以,只有当私钥可以从Windows钥匙库中输出时,JSSE应用程序才可以运行。

  如果你在编写一个运用RSA签名或RSA加密的Java应用程序,那么你可以运用Windows支持的RSA Signature Provider和Cipher Provider。这不需要从Windows钥匙库中输出私钥。对于其它三个提供者(provider),你可以单独使用每一个。

  该代码是用 beta版JDK 1.4.0-rc开发的,很稳定。不过,我们打算将该代码作为一个框架,进行进一步的开发。在将该代码用于生产环境前,你应该改进异常处理,确信在本地代码中没有内存泄露,并使密钥的暴露降低到最小。为了测试代码,你需要一个RSA数字证书。你可以从VeriSign网站www.verisign.com/client/enrollment得到一个临时证书,有效期是60天。具体操作请遵循该站点上的指南。不要选定标为“Protect your Private Key”的框。因为没有选定这个框,你的私钥就可以输出。

  下面的代码初试化了四个提供者:

MSTrustMgrProvider.install();
MSKeyMgrProvider.install();
MSRSASignProvider.install();
MSRSACipherProvider.install();
kmf = KeyManagerFactory
.getInstance("MSKMF");
tmf = TrustManagerFactory.
getInstance("MSTMF");
Cipher cipher =
Cipher.getInstance(
"RSA/ECB/PKCS1Padding");
Signature rsa =
Signature.getInstance(
"SHA1withRSA");

  所有的四个提供者都调用了10个本地的Microsoft函数:

  · MSgetCACerts()从Microsoft证书库返回一列认证授权中心(Certificate Authority (CA))签发的证书。
  · 如果一个证书没有被撤消,MSVerifyCertRevocation()返回true。
  · MSgetPrivateKey()为一个特定的别名(alias )返回私钥。(这里所说的一个别名就是带有一个RSA私钥和证书的一个身份。)钥匙从Microsoft钥匙库中输出。
  · MSgetCert()为一个特定的别名从Microsoft证书库中返回一个证书。
  · MSgetAliases()返回一组别名(带有私钥的一个身份的名字)。Microsoft钥匙库中的每个私钥都有一个别名。
  · MSrsaSignHash()返回哈希数据(hashed data)的RSA签名。
  · MSrsaDecrypt()用RSA算法来解密一个先前加密了的数据块。
  · MSrsaEncrypt()用Microsoft RSA provider来加密一个数据块。
  · MSrsaGetKeysize()返回Microsoft钥匙库中一个钥匙的RSA钥匙大小。
  · MSgetCRL()将一个证书撤消清单(Certificate Revocation List(CRL))下载到Microsoft Internet缓存中。

  一个约500行的用C语言代码编写的源文件mscryptofunctions.c中包含了所有这些函数。该代码可以在Windows 98/NT4/2000/XP上运行。




flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2018 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号
客服电话 0592-8750026    客服信箱 714923@qq.com    客服QQ 714923