【发布时间】:2011-04-15 17:44:40
【问题描述】:
我正在寻找一种在配置文件中加密密码的方法 正在由 Java 程序读取。目前,我阅读了 来自文本文件的密码,但这会使密码保持正确 如果有人要查看配置文件,请公开。
我正在考虑构建一个用户可以输入的简单类 他们想要的密码,获取密码的加密版本,然后 将加密版本粘贴到配置文本文件中。然后 应用程序将读取加密的密码,然后将密码解密回来 变成一个字符串,然后继续。
我遇到了字符串问题-->加密字节-->字符串 转化率。
我正在使用内置的 java 安全类来实现此代码。 这是一些示例测试代码:
// Reads password from config file
String password = ScriptConfig.getString( "password" );
// Generate Key
KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
// Create Encryption cipher
Cipher cipher = Cipher.getInstance( "DES" );
cipher.init( Cipher.ENCRYPT_MODE, key );
// Encrypt password
byte[] encrypted = cipher.doFinal( password.getBytes() );
// Create decryption cipher
cipher.init( Cipher.DECRYPT_MODE, key );
byte[] decrypted = cipher.doFinal( encrypted );
// Convert byte[] to String
String decryptedString = new String(decrypted);
System.out.println("password: " + password);
System.out.println("encrypted: " + encrypted);
System.out.println("decrypted: " + decryptedString);
// Read encrypted string from config file
String encryptedPassword = ScriptConfig.getString( "encryptedPassword"
);
// Convert encryptedPassword string into byte[]
byte[] encryptedPasswordBytes = new byte[1024];
encryptedPasswordBytes = encryptedPassword.getBytes();
// Decrypt encrypted password from config file
byte[] decryptedPassword = cipher.doFinal( encryptedPasswordBytes );//error here
System.out.println("encryptedPassword: " + encryptedPassword);
System.out.println("decryptedPassword: " + decryptedPassword);
The config file has the following variables:
password=password
encryptedPassword=[B@2a4983
When I run the code, I get the following output:
password: passwd
encrypted: [B@2a4983
decrypted: passwd
javax.crypto.IllegalBlockSizeException: Input length must be multiple
of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.DESCipher.engineDoFinal(Da shoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at com.sapient.fbi.uid.TestEncryption.main(TestEncryp tion.java:4
有关我用于执行此操作的错误、结构或流程的任何帮助 会很好。谢谢。
【问题讨论】:
-
如果您的应用程序在客户端机器上,它可以被破解并发现解密密钥。一旦发生这种情况,您也可以使用纯文本。真正保护该工作流程的唯一方法是在安全服务器上进行解密。你试图解决什么问题导致你尝试这个? (为什么需要存储这样的密码?)
-
我不想将密码作为纯文本存储在配置文件中。
-
@user234194:你没抓住重点。如果将解密密钥存储在客户端,则不安全,任何拥有客户端的人都可以解密。
-
最终,不,这不安全,但它是链条中的一个环节。这个想法是,您不想让任何有权访问机器/文件系统的人轻松查看数据库密码是什么。如果安全性仅基于看不到此配置文件的人,那么您将遇到更大的问题:)
标签: java encryption