简单的密码加密 - 我该怎么办?

时间:2015-04-21 20:36:01

标签: java mysql encryption passwords

如何进行简单的密码加密才能进入数据库?我需要这个来保住我的工作!

基本上我需要代码来执行以下操作: 的修改


我有一个名为"用户名"的MySQL表。在我的本地电脑上。

它包含以下列:

  • ID
  • 用户名
  • 密码
  • 帐户类型

此表用于登录应用程序,我需要一种存储密码的安全方法。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

将来,我建议你在没有先展示你尝试过的代码的情况下不要求答案。

话虽如此,我会咬人。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;

public class EncryptHelper
{
    public static String ehashAndSalt(String passedpass) throws NoSuchAlgorithmException, NoSuchProviderException
    {
        String passwordToHash = "password";
        String salt = getSalt();

        String securePassword = getSecurePassword(passwordToHash, salt);

        return securePassword;
    }

    private static String getSecurePassword(String passwordToHash, String salt)
    {
        String generatedPassword = null;
        try
        {
            // Create MessageDigest instance for MD5
            MessageDigest md = MessageDigest.getInstance("MD5");
            //Add password bytes to digest
            md.update(salt.getBytes());
            //Get the hash's bytes
            byte[] bytes = md.digest(passwordToHash.getBytes());
            //This bytes[] has bytes in decimal format;
            //Convert it to hexadecimal format
            StringBuilder sb = new StringBuilder();
            for(int i=0; i< bytes.length ;i++)
            {
                sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            //Get complete hashed password in hex format
            generatedPassword = sb.toString();
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        return generatedPassword;
    }

    //Add salt
    private static String getSalt() throws NoSuchAlgorithmException, NoSuchProviderException
    {
        //Always use a SecureRandom generator
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
        //Create array for salt
        byte[] salt = new byte[16];
        //Get a random salt
        sr.nextBytes(salt);
        //return salt
        return salt.toString();
    }
}

这是一个很好的简单的哈希/盐函数助手类。只需确保在为用户进行身份验证时创建用户时创建的相同“salt”字符串,否则身份验证将失败。

在密码方面,我发现使用哈希/盐函数而不是加密更安全,因为可以使用正确的公钥/私钥来破解加密。

您可以找到有关Java的Native加密Here.

的更多信息

修改

正如@james大指出的那样,你应该随意加盐。我已修改代码以显示此内容。

上述示例的来源:HowToDoInJava

然后,我建议您在创建新用户时将salt和加密密码传递给数据库,然后获取包含salt和密码的结果集,并将其提供给与getSecurePassword()类似的方法并使用结果这是一种验证。

我希望这有帮助!

编辑 - 2

在您的表中插入另一行名为“salt”(或您喜欢的任何内容),然后插入一个带有PreparedStatement的新用户,如下所示:

PreparedStatement pstmnt  = connection.prepareStatement
("insert into Usernames(`ID`,`Username`,`Password`,`Account type`, `salt`) values (?,?,?,?,?,)");
pstmnt.setInt(1, id); //would ideally be auto-incremented
pstmnt.setString(2, user); //user String obtained by any means
pstmnt.setString(3, securePassword); //from the hash/salt example above
pstmnt.setString(4, accType); //whatever naming structure you have for account types
pstmnt.setString(5, salt); //from the above example also.
pstmnt.executeUpdate();