简单的密码加密 - 我该怎么做? [关闭]

Posted

技术标签:

【中文标题】简单的密码加密 - 我该怎么做? [关闭]【英文标题】:Simple password encryption - how do i do? [closed] 【发布时间】:2015-06-29 05:30:26 【问题描述】:

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

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


我的本​​地 PC 上有一个名为“用户名”的 mysql 表。

它有以下列:

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

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

【问题讨论】:

您可能希望您的密码经过哈希处理而不是加密。 我认为加密更强?我怎么需要哈希? insert insert into table where password = ""; -- 这对你来说不是很好。 你有什么建议?抱歉,我是新手 【参考方案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();
    

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

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

您可以找到更多关于 Java 的 Native 加密的信息Here.


编辑

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

上例来源:HowToDoInJava

然后我建议您在创建新用户时将盐和加密密码传递给数据库,然后获取包含盐和密码的结果集并将其输入到与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();

【讨论】:

encryptThis 是一个做散列的方法的奇怪名称。 我的现有项目只写了 2 分钟的代码。我会把它改成更合适的:3 如果盐对所有用户都一样,盐就没有用处。只有在每次用户给你一个新密码时你都组成一个新的随机盐字符串,并且你将用户的盐与散列结果一起保存,这才有意义。 james,这是一个很好的观点,我将把它添加到答案中。完全忘记了这个事实facedesk 非常感谢!不知道你是怎么知道的,谢谢!

以上是关于简单的密码加密 - 我该怎么做? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中加密密码管理器的密码[关闭]

在配置文件中加密密码? [关闭]

MD5加密一个文件怎么做???

Java - 如何使用密码短语手动加密数据? [关闭]

我的u盘加密之后忘记了密码,怎么样打开

如何以加密形式将密码字段存储在 oracle 11g 数据库中?