Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mã hóa mật khẩu đơn giản - làm cách nào để làm?

Trong tương lai, tôi khuyên bạn không nên cầu xin câu trả lời mà không hiển thị một số mã bạn đã thử trước.

Điều đó đang được nói, tôi sẽ cắn.

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

Đây là một lớp trợ giúp đơn giản và hay cho một hàm băm / muối. Chỉ cần đảm bảo sử dụng cùng một chuỗi "muối" được tạo khi người dùng được tạo khi bạn xác thực người dùng, nếu không quá trình xác thực sẽ không thành công.

Khi có liên quan đến mật khẩu, tôi thấy sử dụng hàm băm / muối sẽ an toàn hơn là sử dụng mã hóa, vì mã hóa có thể bị phá vỡ bằng đúng khóa công khai / riêng tư.

Bạn có thể tìm thêm thông tin về mã hóa Native của Java Đây.

CHỈNH SỬA

Như @james big đã chỉ ra, Bạn nên ngẫu nhiên hóa muối. Tôi đã sửa đổi mã để hiển thị điều này.

Nguồn của ví dụ trên: HowToDoInJava

Sau đó, tôi sẽ đề nghị bạn chuyển muối và mật khẩu được mã hóa vào cơ sở dữ liệu khi tạo người dùng mới, sau đó nhận tập kết quả có chứa muối và mật khẩu và đưa nó vào một phương thức tương tự với getSecurePassword() và sử dụng kết quả của việc này làm xác nhận.

Tôi hy vọng điều này sẽ hữu ích!

Chỉnh sửa - 2

Chèn một hàng khác vào bảng của bạn có tên là "salt" (hoặc bất cứ thứ gì bạn thích) và chèn một người dùng mới với PreparedStatement, như sau:

Các giá trị
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. Tải lên cơ sở dữ liệu mysql lớn trên AWS RDS bằng cách sử dụng putty - 'Máy chủ MySQL đã biến mất'

  2. Sử dụng SUM trên dữ liệu FLOAT

  3. Chuyển đổi chuỗi trong Python để chèn vào cột ngày tháng của MySQL DB

  4. MySQL trong AWS EC2 - Nó mở rộng quy mô như thế nào?

  5. Không thể tìm cách lấy dữ liệu từ MySql Query