java密碼擴展(The Java Cryptography Extension),是JDK1.4的一個重要部分,基本上,他是由一些包構成的,這些包形成了一個框架并實現(xiàn)了一些加密,密鑰生成算法和協(xié)議,消息認證碼等算法,這篇文章將想你介紹JCE的安裝和使用。
值得注重的是,盡管JCE是JDK1.4的核心包的一部分,我們將首先用JDK1.2及高一點的版本向你演示一下假如安裝配置JCE(靜態(tài)安裝)。稍后,將向你介紹如何在不安裝的情況下使用JCE(動態(tài)安裝)。最后,將演示怎么生成密鑰和密碼,及假如進行基本的加密.解密。
提供者是什么?
提供者是特定加密算法的實現(xiàn)者,有的提供者(提供的加密技術)是免費的,有的不免費,IBM, Bouncy Castle, 和 RSA都是一些(加密)提供者.在本文的后面,我們將考察一下來自Bouncy Castle的RSA算法。Sun 也向大家說明了假如實現(xiàn)自己的提供者(需要符合jDK的一些約定)。
靜態(tài)安裝
在安裝和使用JCE之前,你需要從 Sun Web site(這里是以暗中sun的提供者為例).獲得他的安裝包,JCE有sun他自己的安全提供者-sunJCE,為了吧sunJCE靜態(tài)的安裝到默認的提供者列表中,你需要修改安全屬性文件:
• <java-home>/jre/lib/security/java.security (Win32)
• <java-home>/jre/lib/security/java.security (UNIX)
假如你把JDK安裝在C:/jdk1.3,你需要編輯以下文件:
C:/jdk1.3/jre/lib/security/java.security
為了安裝SunJCE,你需要在以上文件中加入:
security.PRovider.n=com.sun.crypto.provider.SunJCE
把n用你加入的提供者的優(yōu)先級代替(注重:序號要保持遞增,不能跳過,但可以調(diào)整前后順序)。
Listing A 用于查看你安裝過的提供者的信息,結果在Listing B中列出,顯示提供者的能力,比如說可用的加密算法。
Listing A: ProviderInformation.java
import java.security.Provider;
import java.security.Security;
import java.util.Set;
import java.util.Iterator;
public class ProviderInformation {
public static void main(String[] args) {
Provider[] providers = Security.getProviders();
for (int i = 0; i < providers.length; i++) {
Provider provider = providers[i];
System.out.println("Provider name: " + provider.getName());
System.out.println("Provider information: " + provider.getInfo());
System.out.println("Provider version: " + provider.getVersion());
Set entries = provider.entrySet();
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
System.out.println("Property entry: " + iterator.next());
}
}
}
}
Listing B: ProviderInformation.java output
Provider name: SUN
Provider information: SUN (DSA key/parameter generation; DSA signing; SHA-1, md5 digests; SecureRandom; X.509 certificates; JKS keystore)
Provider version: 1.2
Property entry: Alg.Alias.KeyFactory.1.2.840.10040.4.1=DSA
Property entry: Alg.Alias.Signature.1.2.840.10040.4.3=SHA1withDSA
Property entry: Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1=DSA
Property entry: Signature.SHA1withDSA KeySize=1024
Property entry: Signature.SHA1withDSA ImplementedIn=Software
動態(tài)安裝:Listing c 說明了如何在運行時動態(tài)加載安全提供者,要注重的是,當你用Security.addProvider(…)加載提供者時,它是對整個JVM環(huán)境都有用的;
Listing C: DynamicProvider.java
import java.security.Security;
public class DynamicProvider {
public static void main(String[] args) {
// This is all there is to it!
Security.addProvider(new com.sun.crypto.provider.SunJCE());
}
}
如前所述,當你安裝一個提供者時,你用n來指明此提供者的優(yōu)先級,但一個算法的實例被調(diào)用時,JVM將按照提供的優(yōu)先級來在已經(jīng)安裝的提供者中查找可用的實現(xiàn),并使用他首先找到的可用算法。你也可用在調(diào)研時加上附加參數(shù)來指明要在那個提供者中尋找使用的算法。
實現(xiàn)細節(jié):
JCE API包含了大量的為實現(xiàn)安全特性的類和接口,首先,我們做一個DES對稱加密的例子。
生成密鑰:
Listing D 展示了假如初時化密鑰生成器來生成密鑰;
Listing D: DESKeyGenerator.java
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.NoSUChAlgorithmException;
import java.security.Security;
public class DESKeyGenerator {
public static void main(String[] args) {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
System.out.println("Key format: " + key.getFormat());
System.out.println("Key algorithm: " + key.getAlgorithm());
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
新聞熱點
疑難解答