전자정부프레임워크

전자정부프레임워크 암호화

초이진영 2022. 11. 15. 16:50

전자정부 프레임워크에서 암호화 하여 회원가입 하기

 

암호화 알고리즘이란?

 수학적인 과정을 통해 특정한 정보를 의미가 없는 문자로 나열하는 것이다.

 

암호화 (Encryption) 에는 크게 양방향 암호화 와 단방향 암호화가 있다.

 

양방향 암호화는 암호호와 복호화가 가능하며

단방향 암호화는 암호화만 가능하고 복호화가 불가능하다.

 

회원가입을 할 때 사용자의 개인정보들을

보안을 위해 이름이나 이메일 패스워드 등 을 암호화하여 저장해야 한다.

 

전자정부프레임워크에서는 암복호화 라이브러리를 제공해준다.

 

자세한 사용법은

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:com:v3.8:sec:%EC%95%94%ED%98%B8%ED%99%94_%EB%B3%B5%ED%98%B8%ED%99%94

 

egovframework:com:v3.8:sec:암호화_복호화 [eGovFrame]

암호화/복호화는 보안을 위하여 데이터를 암호화하거나 암호화된 데이터를 복호화하기 위해, ARIA 방식을 통한 데이터의 암호화 및 복호화 기능을 제공한다. 암복호화 기능을 사용하기 위해서는

www.egovframe.go.kr

 

정부에서 제공해주는 도큐먼트이다.

 

양방향 알고리즘  : ARIA

단방향 알고리즘  : SHA-256 알고리즘을 사용할것이다.

 

 

1. 먼저 view단에서 회원가입시 필요한 정보들을 받는다.

 

2. 암호화가 필요한 데이터들을 정리한뒤 

 

EgovEnvCryptoService에 내재된 함수들을 사용하여 암호화 하면 된다.

 

cryptoservice

암호화 할 때는 .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