我正在开发一个桌面应用程序,并且我有一个登录表单,用户必须填写该表单才能访问该应用程序。
在这个登录表单中,我有一个JCheckBox
which is "Remember me"
。
当用户输入他的 ID 和密码然后检查时"Remember me"
JCheckBox
,我希望程序加密这个 ID 和密码,然后将它们保存在一个文件中。
我的问题是:如何加密这些数据?如果我加密它们然后我想从文件中读取它们,我是否必须破译它们?
我正在开发一个桌面应用程序,并且我有一个登录表单,用户必须填写该表单才能访问该应用程序。
在这个登录表单中,我有一个JCheckBox
which is "Remember me"
。
当用户输入他的 ID 和密码然后检查时"Remember me"
JCheckBox
,我希望程序加密这个 ID 和密码,然后将它们保存在一个文件中。
我的问题是:如何加密这些数据?如果我加密它们然后我想从文件中读取它们,我是否必须破译它们?
最好的解决方案是不要加密/解密用户名/密码,因为它可能会被破坏。无论如何,这是一个 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
你的问题没有足够的细节来提供准确的答案,但我会试一试。
首先,不要在本地加密密码,因为这意味着您的应用程序还必须解密它,因此它将在内存中保存对称密钥并使其易受攻击。
如果您需要在本地验证用户的密码,请使用带盐的单向散列函数。请注意,这意味着您必须将纯文本文件写入不安全的磁盘(如果对文件具有写访问权限,人们可以修改密码哈希)。为了克服这个问题,您需要使用对称加密方案并在每次读取/写入文件时都需要密钥。这也不会阻止人们破坏文件。
如果您谈论的是客户端-服务器应用程序,请在服务器上生成一个临时令牌并实施一些到期机制。