[시큐어코딩 가이드] 충분하지 않은 키 길이 사용
- 정보보안/시큐어코딩 가이드
- 2022. 8. 10.
■ 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
충분하지 않은 키 길이 사용
■ 개요
길이가 짧은 키를 사용하는 것은 암호화 알고리즘을 취약하게 만들 수 있다. 키는 암호화 및 복호화에 사용되는데, 검증된 암호화 알고리즘을 사용하더라도 키 길이가 충분히 길지 않으면 짧은 시간 안에 키를 찾아낼 수 있고 이를 이용해 공격자가 암호화된 데이터나 패스워드를 복호화 할 수 있게 된다.
암호 알고리즘 및 키 길이 선택 시, 암호 알고리즘의 안전성 유지기간과 보안강도별 암호 알고리즘 키 길이 비교표를 기반으로 암호 알고리즘 및 키 길이를 선택하여야 한다.
■ 안전한 코딩 기법
RSA 알고리즘은 적어도 2,048 비트 이상의 길이를 가진 키와 함께 사용해야 하고, 대칭 암호화 알고리즘(Symmetric Encryption Algorithm)의 경우에는 적어도 128비트 이상의 키를 사용한다.
코드예제
보안성이 강한 RSA 알고리즘을 사용하는 경우에도 키 사이즈를 작게 설정하면 프로그램의 보안약점이 발생할 수 있다.
안전하지 않은 코드의 예 |
from Crypto.PublicKey import RSA, DSA, ECC from tinyec import registry import secrets def make_rsa_key_pair(): # RSA키 길이를 1024 비트로 설정하는 경우 안전하지 않음 private_key = RSA.generate(1024) public_key = private_key.publickey() def make_ecc(): # 2015년부터 ECC 키 길이를 256 비트 이상으로 제안하고 있음. ecc_curve = registry.get_curve('secp192r1') private_key = secrets.randbelow(ecc_curve.field.n) public_key = private_key * ecc_curve.g |
RSA, DSA의 경우 키의 길이는 적어도 2048 비트 ECC의 경우 256 비트 이상으로 설정한다.
아래 예제 중 ECC 키 생성은 tinyec 모듈을 사용하여 ECC 키를 생성한 예제이다.
안전한 코드의 예 |
from Crypto.PublicKey import RSA, DSA, ECC from tinyec import registry import secrets def make_rsa_key_pair(): # RSA키 길이를 2048 비트 이상으로 길게 설정 private_key = RSA.generate(2048) public_key = private_key.publickey() def make_ecc(): # ECC 키 길이를 256 비트 이상으로 설정. ecc_curve = registry.get_curve('secp256r1') private_key = secrets.randbelow(ecc_curve.field.n) public_key = private_key * ecc_curve.g |