简单密码加密 - 我该怎么做?
Simple password encryption - how do i do?
请问如何做一个简单的密码加密进入数据库?我需要这个来保住我的工作!
基本上我需要代码来做类似的事情:
编辑
我的本地 PC 上有一个名为 "Usernames" 的 MySQL Table。
它有以下列:
- ID
- 用户名
- 密码
- 账户类型
此 table 用于登录应用程序,我需要一种安全的方式来存储密码。有人可以帮忙吗?
以后,我建议您不要在没有先展示您尝试过的代码之前就乞求答案。
话虽这么说,我会咬人的。
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 函数的一个漂亮而简单的助手 class。只需确保在验证用户时使用创建用户时创建的相同 "salt" 字符串,否则验证将失败。
关于密码,我发现使用 hash/salt 函数比加密更安全,因为可以使用正确的 public/private 密钥破解加密。
您可以找到有关 Java 的本机加密的更多信息 Here.
编辑
正如@james large 指出的那样,您应该将盐随机化。我修改了代码以显示这一点。
上例来源:HowToDoInJava
然后我建议您在创建新用户时将盐和加密密码传递给数据库,然后获取包含盐和密码的结果集并将其输入与 getSecurePassword()
类似的方法并使用结果作为验证。
希望对您有所帮助!
编辑 - 2
在你的 table 中插入另一行名为 "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();
请问如何做一个简单的密码加密进入数据库?我需要这个来保住我的工作!
基本上我需要代码来做类似的事情: 编辑
我的本地 PC 上有一个名为 "Usernames" 的 MySQL Table。
它有以下列:
- ID
- 用户名
- 密码
- 账户类型
此 table 用于登录应用程序,我需要一种安全的方式来存储密码。有人可以帮忙吗?
以后,我建议您不要在没有先展示您尝试过的代码之前就乞求答案。
话虽这么说,我会咬人的。
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 函数的一个漂亮而简单的助手 class。只需确保在验证用户时使用创建用户时创建的相同 "salt" 字符串,否则验证将失败。
关于密码,我发现使用 hash/salt 函数比加密更安全,因为可以使用正确的 public/private 密钥破解加密。
您可以找到有关 Java 的本机加密的更多信息 Here.
编辑
正如@james large 指出的那样,您应该将盐随机化。我修改了代码以显示这一点。
上例来源:HowToDoInJava
然后我建议您在创建新用户时将盐和加密密码传递给数据库,然后获取包含盐和密码的结果集并将其输入与 getSecurePassword()
类似的方法并使用结果作为验证。
希望对您有所帮助!
编辑 - 2
在你的 table 中插入另一行名为 "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();