将来的には、最初に試したコードを表示せずに、答えを懇願することは控えることをお勧めします。
そうは言っても、私は噛みます。
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のネイティブ暗号化の詳細については、を参照してください。ここに。
編集
@jamesが大いに指摘したように、ソルトをランダム化する必要があります。これを示すためにコードを修正しました。
上記の例のソース: 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();