有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java简单密码加密怎么办?

我如何做一个简单的密码加密进入数据库请?我需要这个来保住我的工作

基本上,我需要代码来执行以下操作: 编辑


我在本地PC上有一个名为“Usernames”的MySQL表

它有以下列:

  • 身份证
  • 用户名
  • 密码
  • 帐户类型

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


共 (1) 个答案

  1. # 1 楼答案

    以后,我建议您不要在没有先显示您尝试过的一些代码的情况下乞求答案

    话虽如此,我还是要咬人

    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();
        }
    }
    

    这里有一个很好的简单的hash/salt函数助手类。只要确保在对用户进行身份验证时使用与创建用户时相同的“salt”字符串,否则身份验证将失败

    就密码而言,我发现使用哈希/salt函数比使用加密更安全,因为使用正确的公钥/私钥可以破坏加密

    您可以找到有关Java本机加密Here.的更多信息


    编辑

    正如@james large指出的,你应该随机化盐。我修改了代码以显示这一点

    上述示例的来源: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();