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

您所在的位置:网站首页 rsa加密算法java实现 快速入门java中的密码应用开发

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

2023-03-12 08:37| 来源: 网络整理| 查看: 265

  今天介绍一下在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形成一个keySystem.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)并不支持。因此可以去找一些第三方密码功能包来代替使用。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3