java Encrypt password สำหรับ register หรือ login ระบบ

สวัสดีคับ บทความนี้ ผมแปะโค้ดสำหรับการ encrypt password ไว้ครับ เผื่อจะได้นำไปใช้งานได้ ซึ่งผมได้ใช้งานในการ register แล้วก็ login ระบบครับ

package com.bookedsell.service.utils;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;

public class PasswordUtils {
    private static final Random RANDOM = new SecureRandom();
    private static final String ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int ITERATIONS = 10000;
    private static final int KEY_LENGTH = 256;

    public static String getSalt(int length) {
        StringBuilder returnValue = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            returnValue.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length())));
        }
        return new String(returnValue);
    }

    public static byte[] hash(char[] password, byte[] salt) {
        PBEKeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH);
        Arrays.fill(password, Character.MIN_VALUE);
        try {
            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            return skf.generateSecret(spec).getEncoded();
        }
        catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
        }
        finally {
            spec.clearPassword();
        }
    }

    public static String generateSecurePassword(String password, String salt) {
        String returnValue = null;
        byte[] securePassword = hash(password.toCharArray(), salt.getBytes());

        returnValue = Base64.getEncoder().encodeToString(securePassword);

        return returnValue;
    }

    public static boolean verifyUserPassword(String providedPassword, String securedPassword, String salt)
    {
        boolean returnValue = false;

        String newSecurePassword = generateSecurePassword(providedPassword, salt);

        returnValue = newSecurePassword.equalsIgnoreCase(securedPassword);

        return returnValue;
    }
}

จากโค้ดข้างบนสำหรับสร้าง class utils เพื่อนำไปใช้งานครับ ส่วนการใช้งานก็ตามด้านล่างเลยคับ

สำหรับส่วนของ login นะคับ จะมีการ นำ password ที่ user กรอกเข้ามาไปเช็คใน database ว่าตรงกันหรือเปล่าถ้าตรงกันแสดงว่า Login ผ่านครับ โค้ดตัวอย่างตามด้านล่างเลย

boolean passwordMatch = PasswordUtils.verifyUserPassword(password, enUser.getPassword(), enUser.getPasswordSalt());

ส่วนในส่วนของ register ก็ตามด้านล่างครับ

String salt = PasswordUtils.getSalt(30);
String securePassword = PasswordUtils.generateSecurePassword(password, salt);
System.out.println("===========> securePassword ==> " + securePassword);
System.out.println("===========> salt ==> " + salt);

ลองนำไปใช้กันดูครับ

ส่วน ref ก็ตามลิ้งเลยคับ http://www.appsdeveloperblog.com/encrypt-user-password-example-java/

Tags:

Add a Comment

Your email address will not be published. Required fields are marked *