Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Proste szyfrowanie hasła - jak to zrobić?

W przyszłości sugeruję powstrzymanie się od błagania o odpowiedzi bez uprzedniego pokazania jakiegoś wypróbowanego kodu.

Biorąc to pod uwagę, ugryzę.

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

Oto ładna i prosta klasa pomocnicza dla funkcji hash/salt. Tylko pamiętaj, aby użyć tego samego ciągu „sól”, który został utworzony podczas tworzenia użytkownika, w celu uwierzytelnienia użytkownika, w przeciwnym razie uwierzytelnianie się nie powiedzie.

Jeśli chodzi o hasła, uważam, że bezpieczniej jest używać funkcji skrótu/soli niż szyfrowania, ponieważ szyfrowanie można złamać za pomocą prawidłowego klucza publicznego/prywatnego.

Więcej informacji na temat natywnego szyfrowania Java można znaleźć Tutaj.

EDYTUJ

Jak zauważył @james large, sól należy posortować losowo. Zmieniłem kod, aby to pokazać.

Źródło powyższego przykładu:HowToDoInJava

Sugerowałbym wtedy przekazanie soli i zaszyfrowanego hasła do bazy danych podczas tworzenia nowych użytkowników, a następnie pobranie zestawu wyników zawierającego sól i hasło i podanie go w podobną metodę do getSecurePassword() i wykorzystanie wyniku tego jako walidacji.

Mam nadzieję, że to pomoże!

Edytuj - 2

Wstaw do tabeli kolejny wiersz o nazwie „sól” (lub cokolwiek chcesz) i wstaw nowego użytkownika z przygotowanym oświadczeniem, na przykład:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. losowe 2 rekordy według pozycji i kolejności według pozycji

  2. Zapytanie natywne JPA dla pola LONGTEXT w widoku MySQL powoduje błąd

  3. Logowanie-Uwierzytelnianie do zdalnej bazy danych mysql

  4. Zmień nazwę kolumny w MySQL

  5. Jak włączyć SSL/TLS dla MySQL w Ubuntu?