비밀번호 암호화 알고리즘 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/10 : object storage (0) | 2023.11.10 |
---|---|
11/08 : 회원가입 이메일 인증 (0) | 2023.11.08 |
11/07 : 중간발표 / Alert 디자인 추가 (0) | 2023.11.07 |
비밀번호 암호화 알고리즘 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/10 : object storage (0) | 2023.11.10 |
---|---|
11/08 : 회원가입 이메일 인증 (0) | 2023.11.08 |
11/07 : 중간발표 / Alert 디자인 추가 (0) | 2023.11.07 |