티스토리 뷰

Project 여담/6주차

11/09 : 비밀번호 암호화

xoo | 수진 2023. 11. 9. 22:27

비밀번호 암호화 알고리즘 SHA-256 이란?

SHA-256 (Secure Hash Algorithm 256-bit)

SHA-256은 안전한 단방향 해시 함수로, 주로 비밀번호나 메시지를 안전하게 저장하거나 전송할 때 사용된다. "단방향"이라는 용어는 한 번 해시되면 원본 값을 복원할 수 없다는 것을 의미한다. SHA-256은 256비트 길이의 고정된 크기의 해시 값을 생성하며, 충돌 가능성이 매우 낮아 안전한 알고리즘 중 하나로 알려져 있다.

 

해싱이란?

해싱은 임의의 크기의 데이터를 고정된 크기의 고유한 값으로 변환하는 과정을 의미한다. 이 변환된 값은 해시 또는 해시 값이라고도 불린다. 해싱은 단방향 암호화 함수의 한 형태로, 원본 데이터를 해시 함수에 넣으면 항상 동일한 크기의 고유한 해시 값이 생성된다.

 

 


 

검증 절차

 

1. 회원가입 시 암호화 : 회원가입 시 입력한 패스워드는 알고리즘을 통해 암호화 되고, 암호화 된 패스워드는 데이터베이스에 저장된다.

2. 로그인 시 해시 값 추출 : 사용자가 로그인을 시도할 때, 입력한 패스워드는 다시 SHA-256 알고리즘을 통해 암호화된다.

3. 저장된 패스워드의 조회 : 사용자가 입력한 아이디에 해당하는 패스워드의 해시 값이 데이터베이스에서 조회된다.

4. 패스워드의 일치 여부 확인 : 사용자가 입력한 패스워드의 해시 값과 데이터베이스에 저장된 해시 값이 일치하는지 확인한다. 일치하면 로그인 성공.

 

 


 

 

적용 방법

Java에서 SHA-256을 사용하기 위해 MessageDigest 클래스를 활용한다.

 

 

1. MemberDTO.java에 salt 추가

@Alias("MemberDTO")
public class MemberDTO {
	private String userID;
	private String passwd;
	private String name;
	private String email;
	private String post;
	private String addr1;
	private String addr2;
	private String phone;
	private int mail_auth;
	private String mail_key;
	private String salt;      // salt 추가
}

 

 

2. MemberMapper.xml

<!-- 회원가입  +salt 추가 -->
    <insert id="register" parameterType="MemberDTO">
    insert into member(userID, passwd, name, email, post, addr1, addr2, phone, salt )
    values (#{userID},#{passwd},#{name},#{email},#{post},#{addr1},#{addr2},#{phone},#{salt})
    </insert>

<!-- salt값 가져오기 -->
	<select id="selectSalt" parameterType="string" resultType="string">
		select salt
		from member
		where userID = #{userID}
	</select>

 

 

3. MemberDAO.java

// salt값 가져오기
	public String selectSalt(String userID) {
		return session.selectOne("MemberMapper.selectSalt", userID);
	}

 

 

4. MemberServiceImpl.java

// 단방향 암호화 - salt값 생성
public String getSalt() {
    // 1. Random, slat 생성
    SecureRandom sr = new SecureRandom();
    byte[] salt = new byte[20];
    
    // 2. 난수 생성
    sr.nextBytes(salt);
    
    // 3. byte To String (10진수 문자열로 변경)
    StringBuffer sb = new StringBuffer();
    for(byte b : salt) {
        sb.append(String.format("%02x", b));
    }
    
    return sb.toString();
}

// 단방향 암호화 - SHA-256 알고리즘 적용
public String getEncrypt(String pw, String salt) {
    String result = "";
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");

        // pwd+salt 적용 전
//      System.out.println("PWD+slat 적용 전 : "+pw+salt);
        
        md.update((pw+salt).getBytes());
        byte[] pwSalt = md.digest();
        
        StringBuffer sb = new StringBuffer();
        for(byte b : pwSalt) {
            sb.append(String.format("%02x", b));
        }
        
        result = sb.toString();
        
        // pwd+salt 적용 후
//      System.out.println("PWD+slat 적용 후 : "+result);
    } catch(NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
//  System.out.println("result : "+result);
    return result;
}

 

여기서 getSalt 메서드는 20바이트의 난수를 생성하여 이를 16진수 문자열로 변환한 값을 반환한다.

이렇게 생성된 salt는 사용자의 비밀번호와 결합하여 최종적으로 SHA-256 해시 함수를 통해 암호화 된다. 암호화된 비밀번호는 데이터베이스에 저장되어 보안성을 강화한다.

 

'Project 여담 > 6주차' 카테고리의 다른 글

11/14 : 수료식과 짧은 회고  (0) 2023.11.14
11/10 : object storage  (0) 2023.11.10
11/08 : 회원가입 이메일 인증  (0) 2023.11.08
11/07 : 중간발표 / Alert 디자인 추가  (0) 2023.11.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함