ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회원가입 SHA-256
    공부/기본 2023. 11. 20. 11:59

    SHA-256

    - 64자리의 문자열을 반환

    - 단방향 암호화 : 암호화된 문자열을 다시 원래의 문자열로 복호화할 수 없는 방법

    - 입력값이 조그만 달라지더라도 변환되는 값이 완전히 달라지기때문에 변환값을 토대로 입력값을 유추하는 것은 거의 불가능

     

    import javax.xml.bind.DatatypeConverter;
    import java.nio.charset.StandardCharsets;
    import java.security.MessageDigest;
     
    class Main
    {
        public static void main(String[] args) throws Exception
        {
            String password = "SHA-256";
     
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] digest = md.digest(password.getBytes(StandardCharsets.UTF_8));
            String sha256 = DatatypeConverter.printHexBinary(digest).toLowerCase();
     
            // SHA-256 메시지 다이제스트 인쇄
            System.out.println(sha256);
        }
    }

    - messageDigest class 사용

     

    https://vmpo.tistory.com/111

     

    [java] sha-256 해싱 알고리즘 사용하기

    블록체인에서 가장 많이 사용하고 있는 해싱 알고리즘인 sha-256 알고리즘을 java로 구현 해보도록 하겠습니다. 1. sha256으로 해싱 java 기본 클래스인 MessageDigest 를 활용한다. -MessageDigest 객체 생성 -

    vmpo.tistory.com

     

    public class SHA256 {
        public SHA256() {
        }
    
    	// 0)
        public static String createSalt(String plainText) throws NoSuchAlgorithmException {
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            byte [] bytes = new byte[16];
            random.nextBytes(bytes);
    
            //SALT 생성
            String salt = new String(Base64.getEncoder().encode(bytes));
    
            //System.out.println("{SHA256.Class} salt : " + salt);
            return salt;
        }
    
        public static String encrypt(String plainText, String salt) {
            try {
                // 1) 
                MessageDigest md = MessageDigest.getInstance("SHA-256");
                String rawAndSalt = plainText + salt;
                //System.out.println("{SHA256.Class} rawAndSalt : " + rawAndSalt);
    
                // 2) 
                md.update(rawAndSalt.getBytes());
    
                // 3) 
                byte[] byteData = md.digest(); // 1byte = 8bit
    
                // 4)
                StringBuffer hexString = new StringBuffer();
                for(int i = 0; i < byteData.length; ++i) {
                    String hex = Integer.toHexString(255 & byteData[i]);
                    if (hex.length() == 1) {
                        hexString.append('0');// 각 byteData당 두 자리 수 16진수로 변환
                    }
                    hexString.append(hex);
                }
    
                return hexString.toString();
    
            } catch (Exception var7) {
                var7.printStackTrace();
                throw new RuntimeException();
            }
        }
    }

     

    - PlainText -> SHA256(Hash Algorithm) -> CipherText

    형태의 단방향 암호화를 진행하고 암호화 키가 존재하지 않기 때문에 복호화도 불가능

     

    1. PlainText + salt 값으로 해시 값 계산

    - 해시값 계산을 하기위한 messagedigest 클래스에 sha256 알고리즘을 옵션으로 선택

     

    2. MessageDigest.update()

    - 메소드 호출할 때 마다 객체 내에 저장된 digest 값이 계속해서 갱신

    - digest 값은 평문의 hashvalue

     

    3. HashVlue를 (1)Byte타입으로 리스트 변환

    - digest()메서드를 호출하여 객체내 digest 값 반환

    - 바이트배열로 해쉬를 삽입, 패딩 등 최종 처리를하여 해시계산 완료

     

    4. 비트 연산을 이용한 HashValue 전처리

    - hash 값이 음수일 경우 양수로 변화하기위한 작업

     

     

    1. 로그인 시에 최초로 발생한 salt값을 db에 유저정보와 함께 저장

    2. salt값은 source가 같아도 만들때마다 다른값이 반환, 최초에 저장된 salt값이 아니면 똑같은 hashvalue에 도달 불가능

    3. 회원가입시 plaintext형태의 비밀번호 + 해당 salt값을 sha256 알고리즘으로 암호화한 ciphertext 비밀번호를 db에 저장

    4. 클라이언트가 로긍니 요청 시 서버 내부에서 식별자를 이용해 db에 있는 salt 값을 조회

    5. 클라이언트가 입력한 plaintext 비밀번호 db조회 salt값을  sha256 알고리즘으로 암화화 db에 저장되어있는 암호화된 비밀번호와 비교후 일치하면 유요한 로그인으로 서비스를 제공

     

     

    '공부 > 기본' 카테고리의 다른 글

    jwt 최종 정리  (0) 2023.11.24
    Optional  (1) 2023.11.21
    예외 클래스의 계층구조  (1) 2023.11.20
    Spring MVC 아키텍처  (0) 2023.11.20
    @ExecptionHandler 코드 조금 더 보고 공부하기  (0) 2023.11.20
Designed by Tistory.