我正在创建一个系统,该系统将用户名和密码列表存储在数据库中,并使用它们登录某些站点并执行某些任务。我想以安全的方式将密码存储在数据库中。由于我对散列的理解有限,我知道它不是我可以使用的,因为我需要稍后取回纯文本。我还听说在数据库中存储加密密码是一种不好的做法。那么我可以采取什么方法呢?
问问题
1269 次
3 回答
2
我想你自己回答了你的问题:
如果您需要存储用户名/密码以便用户可以对您的应用进行身份验证,推荐的方法是存储密码的哈希值。这样,即使您的数据库遭到破坏,密码也无法恢复。
但是你的情况是不同的。您想存储用户名/密码列表以访问其他站点。正如您所说,您必须能够以明文形式取回它们。加密似乎是唯一的方法。
这是所有密码管理器面临的相同问题:您的密码列表与您用于管理列表的“主”密码一样安全。
于 2013-09-03T05:46:52.990 回答
0
虽然我似乎无法想象这对密码有什么用途,但您可以轻松使用 MySQL 的AES 加密解密功能。如果您可以为每个用户使用唯一的密钥会更好。
于 2013-09-04T05:29:00.177 回答
-1
你可以试试这个
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import sun.misc.BASE64Encoder;
public class EncryptUtil {
private static final byte[] SALT = {
(byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
(byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
};
private static String encrypt(String property, char[] password) throws GeneralSecurityException, UnsupportedEncodingException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(password));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8")));
}
private static String base64Encode(byte[] bytes) {
// NB: This class is internal, and you probably should use another impl
return new BASE64Encoder().encode(bytes);
}
public static String encryptPassword(String username, String password) throws UnsupportedEncodingException, GeneralSecurityException{
char[] pwChar = password.toCharArray();
String encryptedPassword = encrypt(username, pwChar);
return encryptedPassword;
}
}
然后只需调用该函数encryptPassword()
于 2013-09-03T05:45:03.340 回答