전자정부 프레임워크에서 암호화 하여 회원가입 하기
암호화 알고리즘이란?
수학적인 과정을 통해 특정한 정보를 의미가 없는 문자로 나열하는 것이다.
암호화 (Encryption) 에는 크게 양방향 암호화 와 단방향 암호화가 있다.
양방향 암호화는 암호호와 복호화가 가능하며
단방향 암호화는 암호화만 가능하고 복호화가 불가능하다.
회원가입을 할 때 사용자의 개인정보들을
보안을 위해 이름이나 이메일 패스워드 등 을 암호화하여 저장해야 한다.
전자정부프레임워크에서는 암복호화 라이브러리를 제공해준다.
자세한 사용법은
egovframework:com:v3.8:sec:암호화_복호화 [eGovFrame]
암호화/복호화는 보안을 위하여 데이터를 암호화하거나 암호화된 데이터를 복호화하기 위해, ARIA 방식을 통한 데이터의 암호화 및 복호화 기능을 제공한다. 암복호화 기능을 사용하기 위해서는
www.egovframe.go.kr
정부에서 제공해주는 도큐먼트이다.
양방향 알고리즘 : ARIA
단방향 알고리즘 : SHA-256 알고리즘을 사용할것이다.
1. 먼저 view단에서 회원가입시 필요한 정보들을 받는다.
2. 암호화가 필요한 데이터들을 정리한뒤
EgovEnvCryptoService에 내재된 함수들을 사용하여 암호화 하면 된다.
암호화 할 때는 .encrypt( "암호화할 평문");
복호화 할 때는 .decrypt("복호화할 평문");
양방향 암호화는 eGov에서 제공해주기때문에 함수만 찾아쓰면 간편하다.
단방향 암호화 할때는 복호화가 불가능하기 때문에 암호화할때 salt라는것을 사용하며 이값을 꼭 같이 저장해야한다.
로그인이나 데이터를 확인할때 이 salt값을 불러와서 암호화하여 비교하는 방식으로 확인한다.
암호화할때는
Java 8 부터 표준 API에 들어가있는 Base64를 이용한다.
먼저 salt 값을 담을 변수를 만들어준다.
byte 타입의 배열 변수이며
salt는 64비트의 크기로 만들것이기 때문에 byte[8]로 초기화시킨다.
byte[] bSalt = new byte[8];
그 뒤
SecureRandom을 이용하여 난수를 발생시키는데 이때 난수발생 알고리즘을 SHA1PRNG 로 지정한뒤 발생시킨다.
발생한 난수를 salt값에 넣어준다.
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.nextBytes(bSalt);
다음
/* java에서 MD5, SHA 를 이용한 알고리즘을 사용하려면 MessageDigest 클래스를 이용한다. */
MessageDigest 를 이용하여 update() 메소드와 digest()를 이용하여 비밀번호 암호문을 뽑는다.
update() : 지정된 바이트 데이터를 사용해 다이제스트를 갱신한다.
digest() : 바이트배열로 해쉬를 반환한다, 패딩 등의 최종 처리를 행해 해시 계산을 완료한다.
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
byte[] input = digest.digest(password.getBytes("UTF-8"));
for (int i = 0; i < iterationNb; i++) {
digest.reset();
input = digest.digest(input);
}
for문이 끝난뒤 input에는 암호문이 담긴다.
다음
Base64.encode로 input 값을 인코딩하고, salt값도 인코딩해서
값에 담아주면 암호화가 완료된다.
전체적인 소스는 이렇다
모듈화를 통해 재사용성을 높일수 있다.
public static String[] getEncryptionBySHA256(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
if(password == null || "".equals(password)) {
return null;
}
String[] result = new String[2];
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
// Salt generation 64 bits long
byte[] bSalt = new byte[8];
random.nextBytes(bSalt);
byte[] bDigest = getHash(ITERATION_NUMBER,password,bSalt);
String sDigest = Base64.encode(bDigest);
String sSalt = Base64.encode(bSalt);
result[0] = sDigest;
result[1] = sSalt;
return result;
}
getHash()
private static byte[] getHash(int iterationNb, String password, byte[] salt) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
byte[] input = digest.digest(password.getBytes("UTF-8"));
for (int i = 0; i < iterationNb; i++) {
digest.reset();
input = digest.digest(input);
}
return input;
}
이런식으로 따로 함수들을 빼놓으면
컨트롤러에서는
String[] pwdByte = 클래스.getEncryptionBySHA256("암호화할 패스워드"); 로 보내주면
pwdByte[0] = 암호화한 패스워드
pwdByte[1] = salt값이 들어가게 된다.
'전자정부프레임워크' 카테고리의 다른 글
전자정부프레임워크(eGovFrame)란? (0) | 2022.11.14 |
---|---|
egovMap이란? (0) | 2022.09.26 |