java

位置:IT落伍者 >> java >> 浏览文章

论Java加密技术与Windows的结合


发布日期:2023年04月26日
 
论Java加密技术与Windows的结合

论Java加密技术与Windows的结合

作者:独行客

公共钥匙加密技术需要一个空间来存储数字证书和私钥通过将钥匙和证书存储到一个文件中(称为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 ProviderKeyManager ProviderRSA 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 rc开发的很稳定不过我们打算将该代码作为一个框架进行进一步的开发在将该代码用于生产环境前你应该改进异常处理确信在本地代码中没有内存洩露并使密钥的暴露降低到最小为了测试代码你需要一个RSA数字证书你可以从VeriSign网站/client/enrollment得到一个临时证书有效期是具体操作请遵循该站点上的指南不要选定标为Protect your Private Key的框因为没有选定这个框你的私钥就可以输出

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

MSTrustMgrProviderinstall()

MSKeyMgrProviderinstall()

MSRSASignProviderinstall()

MSRSACipherProviderinstall()

kmf = KeyManagerFactory

getInstance(MSKMF

tmf = TrustManagerFactory

getInstance(MSTMF

Cipher cipher =

CiphergetInstance(

RSA/ECB/PKCSPadding

Signature rsa =

SignaturegetInstance(

SHAwithRSA

所有的四个提供者都调用了个本地的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缓存中

一个约行的用C语言代码编写的源文件mscryptofunctionsc中包含了所有这些函数该代码可以在Windows /NT//XP上运行

下一页

论Java加密技术与Windows的结合

nava{FONTSIZE:pt}

function sendemail(){

OpenWindow = windowopen(论Java加密技术与Windows的结合&channel=emailwintoolbar=nolocation=noscrollbars=nomenubar=nowidth=height=)

}

Untitled Document

商务应用

E企业

数字电子

E时代

您现在的位置是

开发者网络

程序方舟

Java专栏

T O P 排 行

FreeHand MX全新体验

注册表知识群集

Delphi经典编程

PHP编程实录

网 校 热 门

论Java加密技术与Windows的结合

·

·独行客··天极论坛

上一页

下一页

公共钥匙加密算法

公共钥匙加密有两个目的加密和数字签名公共钥匙加密运用一个包含两部分的钥匙(或一对钥匙)一个私钥和一个公钥公钥带有开始和终止日期一个序号一个身份(称为Subject Distinguished Name)和一个CA的签名(见列表RSA是最常用的公共钥匙加密算法

公共钥匙加密运用一个公钥和一个私钥一个数字证书(如下所示)包含公钥开始和结束日期一个序号一个身份和一个证书授权中心(CA)的签名

Serial number:

C AC FC B E

Signature algorithm: mdRSA

Issuer: CN = VeriSign Class CA Individual

SubscriberPersona Not Validated

OU = /repository/RPA Incorp

By RefLIABLTD(c)

OU = VeriSign Trust Network O = VeriSign Inc

Valid from: Wednesday May :: PM

Valid to: Monday July :: PM

Subject: E =

CN = Brian Boyter

OU = Digital ID Class

OU = Persona Not Validated

OU = /repository/RPA Incorp

by refLIABLTD(c)

OU = VeriSign Trust Network O = VeriSign Inc

Public key: BA B F E

CE C BFD D DBB D DFA DBD F

CE BE C DD B F AA AA

B DD DA EF DAB FBE F FF B

A D C D B A EA

BD CC A DE FF B F

AE FAB F D CC CB

C E EFDC D B B

Basic constraints: Subject Type=End Entity

Path Length Constraint=None

Certificate policy:

Policy Qualifier Id=CPS Qualifier:

Policy Qualifier Info:

Organization=VeriSign Inc

Notice Number=

CRL Distribution Point Distribution Point Name:

Full Name:

URL=

Thumbprint algorithm: sha

Thumbprint: A F AA FFC CD AB AFF FE DFFC

公共钥匙加密中的加密是用公钥来完成的解密是用私钥完成的公共钥匙加密对于大量的加密来说运算很复杂但它却被广泛用来分配密钥密钥或对称加密算法如DES和RC通常用于大量的加密但是密钥

上一篇:三步教你改善Java代码质量

下一篇:Java设置代理IP访问网站