如果我需要将密码解密为纯文本,如何加密数据库中的密码?

时间:2013-09-03 05:37:29

标签: java mysql encryption hash cryptography

我正在创建一个系统,该系统在数据库中存储用户名和密码列表,并使用它们登录某些站点并执行某些任务。 我想以安全的方式将密码存储在数据库中。由于我对哈希的理解有限,我知道它不是我可以使用的东西,因为我需要稍后再获取纯文本。我也听说在数据库中存储加密密码是一种不好的做法。那么我可以采取什么方法?

3 个答案:

答案 0 :(得分:2)

我想你自己回答了你的问题:

如果您需要存储useraname /密码以便用户可以对您的应用进行身份验证,建议的方法是存储密码的哈希值。这样,即使您的数据库遭到入侵,也无法恢复密码。

但你的情况有所不同。您希望存储用户名/密码列表以访问其他站点。正如你所说,你必须能够以明文取回它们。加密似乎是唯一的方法。

这与所有password managers面临同样的问题:您的密码列表与用于管理列表的“主”密码一样安全。

答案 1 :(得分:0)

虽然我似乎无法想象这对密码有什么用处,但您可以轻松使用MySQL的AES encryption-decryption functions。如果你能为每个用户使用一个唯一的密钥会更好。

答案 2 :(得分:-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()