論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 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
rc開發的
很穩定
不過
我們打算將該代碼作為一個框架
進行進一步的開發
在將該代碼用於生產環境前
你應該改進異常處理
確信在本地代碼中沒有內存洩露
並使密鑰的暴露降低到最小
為了測試代碼
你需要一個RSA數字證書
你可以從VeriSign網站/client/enrollment得到一個臨時證書
有效期是
天
具體操作請遵循該站點上的指南
不要選定標為
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/PKCS
Padding
)
Signature rsa =
Signature
getInstance(
SHA
withRSA
)
所有的四個提供者都調用了
個本地的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語言代碼編寫的源文件mscryptofunctions
c中包含了所有這些函數
該代碼可以在Windows
/NT
/
/XP上運行
下一頁
論Java加密技術與Windows的結合
nava{FONT
SIZE:
pt}
function sendemail(){
OpenWindow = window
open(
論Java加密技術與Windows的結合&channel=
emailwin
toolbar=no
location=no
scrollbars=no
menubar=no
width=
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
F
C
B
E
Signature algorithm: md
RSA
Issuer: CN = VeriSign Class
CA Individual
Subscriber
Persona Not Validated
OU = /repository/RPA Incorp
By Ref
LIAB
LTD(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 ref
LIAB
LTD(c)
OU = VeriSign Trust Network
O = VeriSign
Inc
Public key:
BA B
F
E
C
E C
BFD
D DBB
D
DFA
DBD
F
CE
B
E
C
DD
B
F
A
A
A
A
B
D
D D
A
E
F DAB
FB
E F
F
F
B
A
D
C
D
B
A
E
A
BD
CC
A
D
E
FF
B
F
A
E
F
AB F
D C
C
C
B
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 C
D
AB
AFF F
E
DFFC
公共鑰匙加密中的加密是用公鑰來完成的
解密是用私鑰完成的
公共鑰匙加密對於大量的加密來說運算很復雜
但它卻被廣泛用來分配密鑰
密鑰
或對稱加密算法
如DES和RC
通常用於大量的加密
但是密鑰
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26142.html