java - 密码加密

标签 java encryption cryptography password-encryption

我正在尝试编写一个密码加密类,可用于加密和存储用户密码。我想确保我这样做是正确的。这段代码工作正常,似乎生成了一个加密的密码,但我想将其发布在这里以获得一些反馈。对我来说,这相当复杂,而且我知道对于加密货币中的任何东西,很容易犯错误,而没有意识到自己正在犯错误。

这是我的代码:

    public CipherHandler {

        public String encryptPassword(char[] plaintext, String encoding) throws Exception {

            MessageDigest msgDigest = null;
            String hashValue = null;

            /* Convert char array plaintext to byte array */
            byte[] b = new byte[plaintext.length << 1];
            for (int i = 0; i < plaintext.length; i++) {
                b[i] = (byte) plaintext[i]; //will this work regardless of encoding?
            }

            try {
                msgDigest = MessageDigest.getInstance("SHA-256");
                msgDigest.update(b);
                byte rawByte[] = msgDigest.digest();
                hashValue = (new BASE64Encoder()).encode(rawByte);
            } catch (NoSuchAlgorithmException e) {
                System.out.println("No Such Algorithm Exists");
            }

            System.out.println(hashValue);
            return hashValue;
        }            
    }

此函数通常从 Swing 事件处理程序中调用,用户将在其中将密码输入到 JPassword 字段中,这就是我从 char[] 开始的原因。为了进行测试,我使用此代码来调用该函数:

CipherHandler cp = new CipherHandler();
String initPW;
try {
    initPW = cp.encryptPassword("welcome".toCharArray(), "UTF-8");
}

由于这是我第一次尝试,我想我忽略了一些东西。我对任何建议或评论感兴趣。不过,我确实有几个具体问题:

  1. 当我将 char[] 转换为 byte[] 时,我不相信我这样做是正确的。我如何知道要使用哪种编码?在这里,我输入了“UTF-8”,主要是作为占位符,但我担心在某些情况下这可能会失败。

  2. 我读到,我应该在密码被消化后使用盐和迭代,但我不知道如何做到这一点。有人可以就此给我建议吗?

  3. 我正在使用 SHA-256。这是建议的算法吗?我也读过有关 MD5 的内容。是否有一种更适合密码加密的算法?

感谢您的帮助。我很感激!

最佳答案

通常,密码是通过散列而不是加密来存储的。

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(password.getBytes("UTF-8"));

然后将新生成的哈希值与您存储在数据库或其他位置的哈希值进行比较。

对密码加盐也是一个好主意 - 这是在对密码进行哈希处理之前附加到密码的明文值。这使得某人更难以执行离线暴力攻击。

关于java - 密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886330/

相关文章:

java - 来自单个 pom.xml 的自定义第二个打包 Artifact ,如 jar 和 test-jar?

java - 添加新元素时应该使用克隆吗?什么时候应该使用克隆?

java - 如何通过 Selenium 单击模式框中的 HTML 元素?

java - 从 C# 到 JAVA 的 3DES 加密

encryption - 与顺序无关的密码

java - Nodejs 加密 ECDH 公钥十六进制为 X.509

java - 浮点运算和 double ?

php - PHP 5.5 的 Ioncube 难度

cryptography - python Diffie Hellman 标准库

android - 适用于 iPhone 和 Android 的加密