最近项目有一个需求,客户要求将密码保存在keyStore文件中。平时开发的WEB项目,密码明文都是加密后以密文的形式保存在数据库中,第一次遇到这种需求,网上查阅相关资料,大多都是基于android的代码,没有找到基于B/S架构的源码,无奈之下只好自己查阅API编写代码,现公布于众,希望大家交流指导!
一、需求
将项目中文件的解密密码保存于keystore文件中,使用时再从keystore文件中取出;
二、开发步骤
1、使用keytool工具生成keystore文件,命令如下:
keytool -genkey -alias csdn -keypass -keyalg RSA -keysize 1024 -validity 3650 -keystore D:/csdn_server.keystore -storepass -storetype jceks
keytool命令位于:...\Java\jdk1.7.0_80\bin文件夹中;
相关参数解释如下:
-alias 产生别名 ,别名中包含用户的公钥、私钥和证书
-keypass 指定别名条目的密码(私钥的密码)
-keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
-keysize 指定密钥长度
-validity 指定创建的证书有效期多少天
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-storepass 指定密钥库的密码(获取keystore信息所需的密码)
-storetype java默认的密钥库类型为JKS, 除这种类型外,还有PKCS12、JCEKS两种类型,要存储secret key要使用JCEKS类型,另外两种不支持。
2、保存密码于keystore文件中;
package test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.security.KeyStore; import java.security.KeyStore.ProtectionParameter; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.UnrecoverableEntryException; import java.security.cert.CertificateException; import javax.crypto.spec.SecretKeySpec; public class KeystroreUtil { public static void main(String[] args) { FileInputStream fis = null; OutputStream os = null; try { // 读取keystore文件转换为keystore密钥库对象 fis = new FileInputStream("D:/csdn_server.keystore"); // 生成证书的类型为jceks KeyStore keyStore = KeyStore.getInstance("jceks"); // 该密钥库的密码"",storepass指定密钥库的密码(获取keystore信息所需的密码) String storepass = ""; keyStore.load(fis, storepass.toCharArray()); fis.close(); // 一旦加载了 keystore,就能够从 keystore 读取现有条目,或向 keystore 写入新条目: String alias = "csdn";// 别名 String keypass = ""; // 别名密码 ,keypass 指定别名条目的密码(私钥的密码) ProtectionParameter param = new KeyStore.PasswordProtection(keypass.toCharArray()); KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, param); PrivateKey myPrivateKey = pkEntry.getPrivateKey(); System.out.println("获取的私钥是:" + myPrivateKey.toString()); // 根据给定的字节数组构造一个密钥 String desPwd = "jsfect*des*pwd";// 用户要求保存于keystore文件中的密码 String password = "decryp pwd"; javax.crypto.SecretKey mySecretKey = new SecretKeySpec(desPwd.getBytes(), "JKS"); KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey); keyStore.setEntry("desPws", skEntry, new KeyStore.PasswordProtection(password.toCharArray())); //将此 keystore 存储到给定输出流,并用给定密码保护其完整性。 os = new FileOutputStream("D:/csdn_server.keystore"); keyStore.store(os, storepass.toCharArray()); os.close(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (UnrecoverableEntryException e) { e.printStackTrace(); } finally { try { if(os != null) os.close(); if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
讯享网
3、取出保存的密码
讯享网package test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; / * 从keystore文件中取出密码 */ public class KeyStoreUtil { public static void main(String[] args) { String storepass = ""; try { FileInputStream fis = null; // 读取keystore文件转换为keystore密钥库对象 fis = new FileInputStream("D:/csdn_server.keystore"); // 因为生成证书的类型为JKS 也有其他的格式 KeyStore keyStore = KeyStore.getInstance("jceks"); // 该密钥库的密码"",storepass指定密钥库的密码(获取keystore信息所需的密码) keyStore.load(fis, storepass.toCharArray()); fis.close(); String password = "decryp pwd"; // 根据别名(alias=desPws)从证书(keyStore)获取密码并解密 //keyStore.getKey返回与给定别名关联的密钥,并用给定密码来恢复它。 Key key = keyStore.getKey("desPws", password.toCharArray()); //key.getEncoded()返回基本编码格式的密钥,如果此密钥不支持编码,则返回 null。 System.out.println("从证书中获取的解密密码是:" + new String(key.getEncoded())); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (CertificateException e) { e.printStackTrace(); } } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/45891.html