Secure Coding Guide | 취약한 암호화 알고리즘 사용

정의

중요 정보(금융정보, 개인정보, 인증정보 등)의 기밀성을 보장할 수 없는 취약한 암호화 알고리즘을 사용해 정보가 노출될 수 있는 보안약점이다.

영향

개인 정보 유출과 같은 침해 사고가 발생한다.

참고 자료

취약한 알고리즘

암호화 알고리즘 키 길이
DES -
RSA, RSAES 2048bit 미만
AES, ARIA, SEED 128bit 미만

 

해시 알고리즘
MD5
SHA-1
HAS-160

 

안전한 알고리즘

암호화 알고리즘 키 길이
RSA, RSAES 2048bit 이상
AES, ARIA, SEED 128bit 이상

 

해시 알고리즘
SHA-224
SHA-256
SHA-384
SHA-512

MD5, SHA1 등의 해시가 취약한 이유

비둘기집 원리로 복호화 불가능

  • 해시 함수: 임의의 길이를 갖는 비트열을 입력으로 받아서 정해진 길이의 비트열을 반환하는 함수
  • 비둘기집 원리: 비둘기집 수보다 비둘기 개체수가 더 많은 상황에서 비둘기들을 모두 비둘기 집에 넣으면 최소한 한 개 이상의 비둘기집에는 최소한 두 마리 이상의 비둘기가 있을 수 밖에 없는 원리
  • 해시함수는 정의역(비둘기)과 치역(비둘기집)을 1:1로 매핑하지 않으며, 해싱을 하면 정보 자체가 줄어들기 때문

해시함수의 해독방법

  • 사전화(Dictionary) 공격: 이미 해시되어 있는 문자는열조합 데이터베이스(레인보우 테이블등)를활용하여 동일한 값 매칭하는 공격으로, 패스워드 길이가 짧거나, 자주사용하는 단어등의 단순한 패스워드는 데이터베이스에 포함되 어 있음
  • 무작위 대입(Brute Force) : 가능한 모든 값을 대입하는 것이며, 충분한 시간이 존재한다면 암호화된 정보를 해독 할 수 있다. 하지만 대부분의 경우 모든 계산을 마치려면 실용적이지 못한 비용이나 시간을 소요하게 되어, 공격을 방지하게 한다.

MD5, SHA1등의 해시함수는 길이가 짧아 서로 다른 문자열조합이 동일한 해시를 가지는 해시 충돌 발생 SHA256, SHA512등 보다 더욱 빠르게 해독 될 수 있음

조치 방법

안전하지 않은 암호화 알고리즘을 사용했을 경우이다.

안전하지 않은 Java 코드 일부

public String getCryptedPassword(String salt, String password) {
    return new MD5HashGenerator().getValue(password);
}

취약하다고 알려진 암호화 알고리즘 MD5를 사용하고 있다.

안전한 Java 코드 일부

public String getSalt(String userId, String password) {
    return SHA256HashGenerator.getInstance().getValue("--" + Calendar.getInstance().getTime().toString() + "--" + userId + "--");
}

public String getCryptedPassword(String salt, String password) {
    return SHA256HashGenerator.getInstance().getValue("nest--" + salt + "--" + password + "--");
}

안전한 암호화 알고리즘인 SHA256을 사용해야 한다.