我正在开发桌面应用程序,并且我有一个用户必须填写的登录表单才能访问该应用程序。
在此登录表单中,我有一个JCheckBox
"Remember me"
。
当用户输入他的ID和密码,然后检查"Remember me"
JCheckBox
时,我希望程序加密此ID和密码,然后将其保存在文件中。
我的问题是:如何加密这些数据?如果我加密它们然后我想从文件中读取它们,我是否必须解密它们?
答案 0 :(得分:0)
你的问题没有足够详细的答案,但我会试一试。
首先,不要在本地加密密码,因为这意味着您的应用程序也必须对其进行解密,因此它会将对称密钥保存在内存中并使其易受攻击。
如果您需要在本地验证用户的密码,请使用带盐的单向散列函数。请注意,这意味着您必须将纯文本文件写入磁盘并且不安全(如果用户具有对文件的写入权限,则可以修改密码哈希)。要解决这个问题,您需要使用对称加密方案,并且每次读取/写入文件时都需要密钥。这也不会阻止人们破坏文件。
如果您正在谈论客户端 - 服务器应用程序,请在服务器上生成临时令牌并实施一些到期机制。
答案 1 :(得分:0)
最好的解决方案是不加密/解密用户名/密码,因为它可能会被破坏。 无论如何这里是一个java代码示例,您可以使用它来加密/解密您的数据。它使用[AES] [1]算法。
警告:此代码将密钥保存在java类中,这不是存储密钥的安全方式,因为任何有权访问此类的人都可以查看它并使用此密钥解密加密信息。密钥应存储在外部文件中。
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class CipherUtil {
private static Base64 coder;
// linebreak
private static byte[] linebreak = {}; // Remove Base64 encoder default
private static String secret = "qhebp92ihc13g741"; // secret key length must
// be 16
private static SecretKey key;
private static Cipher cipher;
static {
try {
key = new SecretKeySpec(secret.getBytes(), "AES");
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
coder = new Base64(32, linebreak, true);
} catch (Throwable t) {
t.printStackTrace();
}
}
public static synchronized String encrypt(String plainText) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
return new String(coder.encode(cipherText));
}
public static synchronized String decrypt(String codedText) throws Exception {
byte[] encypted = coder.decode(codedText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encypted);
return new String(decrypted);
}
}
[1]: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard