您的位置 首页 java

java中的密码应用开发快速入门

今天介绍一下在 java 中如何进行密码应用开发。相关密码学概念及背景知识可参考前面的文章,本文不做过多介绍。示例代码均来自网上。

1.摘要:

目前广泛使用的算法有MD4、MD5、SHA-1, jdk 对上面都提供了支持,在java中进行消息摘要很简单, java.security.MessageDigest提供了一个简易的操作方法:

/**

*MessageDigestExample.java

*Copyright 2005-2-16

*/

import java.security.MessageDigest;

/**

*单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存

*/

public class MessageDigestExample{

public static void main(String[] args) throws Exception{

if(args.length!=1){

System.err.println(“Usage:java MessageDigestExample text”);

System.exit(1);

}

byte [] plainText=args[0].getBytes(“UTF8”);

//使用 getInstance (“算法”)来获得消息摘要,这里使用SHA-1的160位算法

MessageDigest messageDigest=MessageDigest.getInstance(“SHA-1”);

System.out.println(“n”+messageDigest.getProvider().getInfo());

//开始使用算法

messageDigest.update(plainText);

System.out.println(“nDigest:”);

//输出算法运算结果

System.out.println(new String(messageDigest.digest(),”UTF8″));

}

}

2.对称加密:

使用对称加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,以下例子使用AES算法来加密:

/**

*PrivateExmaple.java

*Copyright 2005-2-16

*/

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import java.security.Key;

/**

*对称加解密,保证消息机密性

*/

public class PrivateExample{

public static void main(String[] args) throws Exception{

if(args.length!=1){

System.err.println(“Usage:java PrivateExample “);

System.exit(1);

}

byte[] plainText=args[0].getBytes(“UTF8”);

//通过KeyGenerator形成一个key

System.out.println(“nStart generate AES key”);

KeyGenerator keyGen=KeyGenerator.getInstance(“AES”);

keyGen.init(128);

Key key=keyGen.generateKey();

System.out.println(“Finish generating DES key”);

//获得一个加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法

Cipher cipher=Cipher.getInstance(“AES/ECB/PKCS5Padding”);

System.out.println(“n”+cipher.getProvider().getInfo());

//使用密钥加密

System.out.println(“nStart encryption:”);

cipher.init(Cipher.ENCRYPT_MODE,key);

byte[] cipherText=cipher.doFinal(plainText);

System.out.println(“Finish encryption:”);

System.out.println(new String(cipherText,”UTF8″));

System.out.println(“nStart decryption:”);

cipher.init(Cipher.DECRYPT_MODE,key);

byte[] newPlainText=cipher.doFinal(cipherText);

System.out.println(“Finish decryption:”);

System.out.println(new String(newPlainText,”UTF8″));

}

}

3.非对称加解密:

jdk提供了对 RSA 的支持。

/**

*PublicExample.java

*Copyright 2005-2-16

*/

import java.security.Key;

import javax.crypto.Cipher;

import java.security.KeyPairGenerator;

import java.security.KeyPair;

/**

*一个简单的非对称加密例子,Cipher类使用KeyPairGenerator生成的公钥和 私钥

*/

public class PublicExample{

public static void main(String[] args) throws Exception{

if(args.length!=1){

System.err.println(“Usage:java PublicExample “);

System.exit(1);

}

byte[] plainText=args[0].getBytes(“UTF8”);

//构成一个RSA密钥

System.out.println(“nStart generating RSA key”);

KeyPairGenerator keyGen=KeyPairGenerator.getInstance(“RSA”);

keyGen.initialize(1024);

KeyPair key=keyGen.generateKeyPair();

System.out.println(“Finish generating RSA key”);

//获得一个RSA的Cipher类,使用公钥加密

Cipher cipher=Cipher.getInstance(“RSA/ECB/PKCS1Padding”);

System.out.println(“n”+cipher.getProvider().getInfo());

System.out.println(“nStart encryption”);

cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());

byte[] cipherText=cipher.doFinal(plainText);

System.out.println(“Finish encryption:”);

System.out.println(new String(cipherText,”UTF8″));

//使用私钥解密

System.out.println(“nStart decryption”);

cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());

byte[] newPlainText=cipher.doFinal(cipherText);

System.out.println(“Finish decryption:”);

System.out.println(new String(newPlainText,”UTF8″));

}

}

4.数字签名及验证

java中的java.security.Signature类提供了数字签名:

/**

*DigitalSignature2Example.java

*Copyright 2005-2-16

*/

import java.security.Signature;

import java.security.KeyPairGenerator;

import java.security.KeyPair;

import java.security.SignatureException;

/**

*数字签名,使用RSA私钥对对消息摘要签名,然后使用公钥验证

*/

public class DigitalSignature2Example{

public static void main(String[] args) throws Exception{

if(args.length!=1){

System.err.println(“Usage:java DigitalSignature2Example “);

System.exit(1);

}

byte[] plainText=args[0].getBytes(“UTF8”);

//形成RSA公钥对

System.out.println(“nStart generating RSA key”);

KeyPairGenerator keyGen=KeyPairGenerator.getInstance(“RSA”);

keyGen.initialize(1024);

KeyPair key=keyGen.generateKeyPair();

System.out.println(“Finish generating RSA key”);

//使用私钥签名

Signature sig=Signature.getInstance(“SHA1WithRSA”);

sig.initSign(key.getPrivate());

sig.update(plainText);

byte[] signature=sig.sign();

System.out.println(sig.getProvider().getInfo());

System.out.println(“nSignature:”);

System.out.println(new String(signature,”UTF8″));

//使用公钥验证

System.out.println(“nStart signature verification”);

sig.initVerify(key.getPublic());

sig.update(plainText);

try{

if(sig.verify(signature)){

System.out.println(“Signature verified”);

}else System.out.println(“Signature failed”);

}catch(SignatureException e){

System.out.println(“Signature failed”);

}

}

}

5.数字证书。

java是以密钥库的形式存储密钥和证书的,而密钥库就是缺省名称为 .keystore 的文件(因此java不能使用USB Key载体的证书),里面的密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护。

我们可以使用工具keytool,对密钥库进行管理,其主要命令如下。

certreq 生成证书请求

changealias 更改条目的别名

delete 删除条目

exportcert 导出证书

genkeypair 生成密钥对

genseckey 生成密钥

gencert 根据证书请求生成证书

importcert 导入证书或证书链

importkeystore 从其他密钥库导入一个或所有条目

keypasswd 更改条目的密钥口令

list 列出密钥库中的条目

printcert 打印证书内容

printcertreq 打印证书请求的内容

printcrl 打印 CRL 文件的内容

storepasswd 更改密钥库的存储口令

可以看出,虽然不是真正的CA系统,但keytool已经提供了CA最基本的功能。java提供了KeyStore、X509Certificate等类对密钥库和证书进行操作:

InputStream inStream = new FileInputStream(“c:/certificate.p12”);

KeyStore ks = KeyStore.getInstance(“PKCS12”);

ks.load(inStream, “password”.toCharArray());

String alias = ks.aliases().nextElement();

certificate = (X509Certificate) ks.getCertificate(alias);

System.out.println(certificate .getNotAfter());

上面介绍的都是最基本的东西,并不是很难,但有助于大家快速实现在java中的密码应用开发。要说明的是,java自带的密码实现类其实是有限制的,一些复杂的功能或更高级算法(如256位的AES)并不支持。因此可以去找一些第三方密码功能包来代替使用。

文章来源:智云一二三科技

文章标题:java中的密码应用开发快速入门

文章地址:https://www.zhihuclub.com/189365.shtml

关于作者: 智云科技

热门文章

网站地图