IgnatiusHeo

구현단계 보안약점 제거 기준-충분하지 않은 키 길이 사용 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-충분하지 않은 키 길이 사용

Ignatius Heo 2023. 7. 4. 20:44

작성일: 230704

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(360~363p)

구분 - 보안기능
설계단계 - 암호연산
https://cryptocurrencyclub.tistory.com/105
개요 길이가 짧은 키를 사용하는 것은 암호화 알고리즘을 취약하게 만들 수 있다.
키는 암호화 및 복호화에 사용되는데, 검증된 암호화 알고리즘을 사용하더라도 키 길이가 충분히 길지 않으면 짧은 시간 안에 키를 찾아낼 수 있고 이를 이용해 공격자가 암호화된 데이터나 비밀번호를 복호화 할 수 있게 된다.

진단 세부사항
(설계단계)
 ① 대칭키 또는 비대칭키를 이용해서 암복호화를 수행해야 하는 경우 KISA의 암호이용안내서에서 정의하고 있는 암호화 알고리즘과 안전성이 보장되는 암호키 길이를 사용해야 한다.
  ㅇ  암복호화 기능 설계 시 안전한 암호 알고리즘을 사용하도록 설계되었는지 확인
      - 대칭키: SEED, ARIA, AES 등
      - 비대칭키: RSA, KCDSA, ECC 등
  ㅇ  암복호화 기능 설계 시 안전한 암호키 길이를 사용하도록 설계되었는지 확인
      - 대칭키: 128bit 이상
      - 비대칭키: 2048bit 이상
 
 ② 복호화되지 않는 암호화를 수행하기 위해 해시함수를 사용하는 경우 안전한 해시 알고리즘과 솔트값을 적용하여 암호화해야 한다.
  ㅇ  복호화되지 않는 암호화 기능설계시 안전한 암호화 알고리즘을 사용하도록 설계되어 있는지 확인
      - ex)SHA-2 (SHA-3는 왜 안보일까?)
  ㅇ  해시함수의 보안을 강화하기 위해 솔트값(난수발생기를 이용해 생성한 안전한 난수값)을 사용하여 암호화하도록 설계되어 있는지 확인
 
 ③ 난수 생성 시 안전한 난수 생성 알고리즘을 사용해야 한다.
  ㅇ  개발가이드에 안전한 난수 생성알고리즘을 사용하도록 코딩규칙을 정의하고 있는지 확인
      - JAVA: java.security.SecureRandom, java.util.Random
      - C: randomize(seed)
보안대책
(구현단계)
RSA 알고리즘은 적어도 2,048 비트 이상의 길이를 가진 키와 함께 사용해야 하고, 대칭암호화 알고리즘
(Symmetric Encryption Algorithm)의 경우에는 적어도 128비트 이상의 키를 사용한다.
진단방법
(구현단계)
대칭키 암호알고리즘(예,AES, ARID, SEED 등)의 경우 128bit 이상, 해시 함수(예, SHA 등)의 경우 128bit 이상, 공개키 암호알고리즘(예, RSA, DSA 등) 2,048bit 이상(ECC의 경우, 256 이상)의 키를 사용하는지 확인한다.

공개키 암호화에 사용하는 키의 길이는 적어도 2048비트 이상으로 설정한다.

 

다. 코드예제

 

ㅇ 분석

1: public static final String ALGORITHM = "RSA";
2: public static final String PRIVATE_KEY_FILE = "C:/keys/private.key";
3: public static final String PUBLIC_KEY_FILE = "C:/keys/public.key";
4: public static void generateKey() {
5: try {
6: final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
//RSA 키 길이를 1024 비트로 짧게 설정하는 경우 안전하지 않다.
7: keyGen.initialize(1024);
8: final KeyPair key = keyGen.generateKeyPair();
9: File privateKeyFile = new File(PRIVATE_KEY_FILE);
10: File publicKeyFile = new File(PUBLIC_KEY_FILE);

ㅇ 내용

1. RSA인데 2048 안씀?


ㅇ 분석

1: static string UseRSA(string input) {
//RSA 키 길이를 1024 비트로 짧게 설정하는 경우 안전하지 않다.
2: var rsa = new RSACryptoServiceProvider(1024);
3: ...
4: }

ㅇ 내용

1. 이것도 같음


ㅇ 분석

1: EVP_PKEY *RSAKey(){
2: EVP_PKEY *pkey;
3: RSA *rsa;
//RSA 키 길이를 512 비트로 짧게 설정하는 경우 안전하지 않다.
4: rsa = RSA_generate_key(512, 35, NULL, NULL);
5: if(rsa == NULL){
6: printf("Error\n");
7: return NULL;
8: }
9: pkey = EVP_PKEY_new();
10: EVP_PKEY_assign_RSA(pkey, rsa);
11: return pkey;

ㅇ 내용

1. RSA 싫어하세요 ...?

 

 

끝.