Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Enkripsi kata sandi sederhana - bagaimana caranya?

Di masa mendatang, saya sarankan Anda menahan diri untuk tidak meminta jawaban tanpa terlebih dahulu menunjukkan beberapa kode yang telah Anda coba.

Karena itu, saya akan menggigit.

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

Inilah kelas pembantu yang bagus dan sederhana untuk fungsi hash/salt. Pastikan untuk menggunakan string "garam" yang sama yang dibuat saat pengguna dibuat saat Anda mengautentikasi pengguna, jika tidak, autentikasi akan gagal.

Dalam hal kata sandi, saya merasa lebih aman menggunakan fungsi hash/salt daripada enkripsi, karena enkripsi dapat dipecahkan dengan kunci publik/pribadi yang benar.

Anda dapat menemukan informasi lebih lanjut tentang enkripsi Asli Java Di sini.

EDIT

Seperti yang ditunjukkan @james large, Anda harus mengacak garamnya. Saya telah mengubah kode untuk menunjukkan ini.

Sumber dari contoh di atas:HowToDoInJava

Saya kemudian akan menyarankan Anda meneruskan garam dan kata sandi terenkripsi ke database saat membuat pengguna baru, dan kemudian mendapatkan hasil yang berisi garam dan kata sandi dan memasukkannya ke dalam metode yang mirip dengan getSecurePassword() dan menggunakan hasil ini sebagai validasi.

Saya harap ini membantu!

Edit - 2

Sisipkan baris lain ke tabel Anda yang disebut "garam" (atau apa pun yang Anda suka), dan masukkan pengguna baru dengan PreparedStatement, seperti:

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. C# dan mysqldump

  2. SQL:hitung semua catatan dengan kemunculan berturut-turut dengan nilai yang sama untuk setiap set perangkat dan kembalikan hitungan tertinggi

  3. Bagaimana cara membuat tabel dengan hubungan N:M di MySQL?

  4. Bagaimana cara menyimpan nomor telepon di database MySQL?

  5. Cara Mengubah Format Datetime di MySQL