sql >> データベース >  >> RDS >> Mysql

簡単なパスワード暗号化-どうすればよいですか?

    将来的には、最初に試したコードを表示せずに、答えを懇願することは控えることをお勧めします。

    そうは言っても、私は噛みます。

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



    1. PostgreSQL:通貨に使用するデータ型はどれですか?

    2. MySql Connector C ++が原因で未解決の外部シンボルを修正するにはどうすればよいですか?

    3. MySQLで変数をデクリメントすることは可能ですか?

    4. INSERTでIDを返しますか?