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

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

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


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

它包含以下列:

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

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

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

话虽这么说,我会咬人。

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

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

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

您可以在此处找到有关Java的Native加密的更多信息。


编辑

正如@james大指出的那样,你应该随机化盐。 我已修改代码以显示此信息。

上面例子的来源: HowToDoInJava

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

我希望这有帮助!

编辑 - 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();