보안 소프트웨어를 개발하는 데 도움이 되도록 애플리케이션을 개발할 때 다음 모범 사례를 사용하는 것이 좋습니다. 자세한 내용은 Microsoft 보안 개발 수명 주기를 참조하세요.
보안 개발 수명 주기
SDL(보안 개발 수명 주기)은 일련의 보안 중심 활동 및 결과물을 소프트웨어 개발의 각 단계에 맞추는 프로세스입니다. 이러한 활동 및 결과물은 다음과 같습니다.
- 위협 모델 개발
- 코드 검사 도구 사용
- 코드 검토 및 보안 테스트 수행
SDL에 대한 자세한 내용은 Microsoft Security Development Lifecycle 참조하세요.
위협 모델
위협 모델 분석을 수행하면 코드에서 잠재적 공격 지점을 검색하는 데 도움이 될 수 있습니다. 위협 모델 분석에 대한 자세한 내용은 Howard, Michael 및 LeBlanc, David [2003], Writing Secure Code, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington을 참조하세요. (일부 언어 및 국가에서는 이 리소스를 사용할 수 없습니다.)
서비스 팩 및 보안 업데이트
빌드 및 테스트 환경은 동일한 수준의 서비스 팩과 대상 사용자 기반의 보안 업데이트를 미러링해야 합니다. 빌드 및 테스트 환경의 일부인 Microsoft 플랫폼 또는 애플리케이션에 대한 최신 서비스 팩 및 보안 업데이트를 설치하고 사용자가 완성된 애플리케이션 환경에 대해 동일한 작업을 수행하도록 권장하는 것이 좋습니다. 서비스 팩 및 보안 업데이트에 대한 자세한 내용은 Windows 및 Microsoft Security을 참조하세요.
Authorization
최소한의 권한이 필요한 애플리케이션을 만들어야 합니다. 가능한 최소 권한을 사용하면 악성 코드가 컴퓨터 시스템에 손상될 위험이 줄어듭니다. 최소 권한 수준에서 코드를 실행하는 방법에 대한 자세한 내용은 특수 권한으로 실행을 참조 하세요.
암호화 모범 사례
Windows 애플리케이션에서 암호화를 구현하는 경우:
- 모든 새 개발에 암호화 API: 차세대(CNG)를 사용합니다. CryptoAPI는 이전 버전과의 호환성을 위해서만 유지 관리됩니다.
- 암호화 민첩성을 위한 설계 및 사후 양자 계획. 코드 전체에서 하드 코딩된 알고리즘 식별자 또는 키 크기를 분산하지 마세요. 다시 작성하지 않고 알고리즘을 교환할 수 있도록 격리합니다. 이 플랫폼은 서명에 대한 핵심 설정 및 ML-DSA(FIPS 204)를 위한 NIST 양자 후 표준인 ML-KEM(FIPS 203)로 이동하고 있으므로, 특히 기밀 유지 수명이 긴 데이터의 경우 "harvest-now, decrypt-later" 공격에 저항하기 위해 민첩한 디자인을 선호합니다.
- AEAD(인증된 암호화)를 선호합니다. 암호화가 변조를 감지할 수 있도록 AES-GCM 사용합니다. CBC와 같은 인증되지 않은 모드를 사용해야 하는 경우 별도의 무결성 검사(encrypt-then-MAC)와 페어링합니다. 기밀성만으로는 수정으로부터 보호되지 않습니다.
- AES-GCM에서 동일한 키를 사용하여 nonce(IV)를 다시 사용하면 안 됩니다. GCM에서 Nonce 재사용은 치명적입니다. 인증 키를 노출하고 메시지 위조를 사용하도록 설정할 수 있습니다. 모든 암호화 작업에 대해 고유한 nonce를 생성합니다(예: 증분 카운터 또는 새 임의 96비트 값).
- ECB 블록 암호화 모드를 사용하지 마세요. ECB는 블록을 독립적으로 암호화하여 일반 텍스트 데이터의 패턴이 누출됩니다.
- 소스 코드에서 암호화 키를 하드 코딩하지 않습니다. 로컬 키 보호에 DPAPI 를 사용하거나 영구 키에 CNG 키 스토리지 공급자 를 사용합니다.
- 작업을 완료하면 메모리에서 비밀을 지웁 수 있습니다.
SecureZeroMemory를 사용하여 키 자료, 암호 및 기타 중요한 버퍼를 덮어씁니다.
memset와 달리, 컴파일러의 최적화 과정에서 제거되지 않습니다. - AES의 경우 256비트, RSA의 경우 2048비트(3072+ 기본 설정), ECDSA의 경우 256비트의 키 길이를 사용합니다.
- 해시에 SHA-256 이상 사용 보안을 위해 MD5 또는 SHA-1을 사용하지 마세요.
- 항상 암호화 함수에서 반환 값을 확인합니다. 자동으로 실패한 암호화 호출은 일반 텍스트로 저장된 데이터를 남길 수 있습니다.
-
난수를 생성할 때는 BCryptGenRandom(CNG)을 사용하고,
rand()또는 기타 비암호학적 PRNG는 사용하지 마세요. 알고리즘 핸들을 관리하지 않고 시스템에서 선호하는 생성기를 사용하려면BCRYPT_USE_SYSTEM_PREFERRED_RNG을 전달하세요.
추가 정보
모범 사례에 대한 자세한 내용은 다음 항목을 참조하세요.
| 항목 | 설명 |
|---|---|
|
특수 권한으로 실행 |
권한의 보안 영향에 대해 설명합니다. |
|
버퍼 오버런 방지 |
버퍼 오버런을 방지하는 방법에 대한 정보를 제공합니다. |
|
제어 흐름 보호(CFG) |
메모리 손상 취약성에 대해 설명합니다. |
|
DACL 만들기 |
SDDL(보안 설명자 정의 언어)을 사용하여 DACL(임의 액세스 제어 목록)을 만드는 방법을 보여 줍니다. |
|
암호 처리 |
암호 사용 시 보안에 미치는 영향에 대해 설명합니다. |
|
Dynamic Access Control 개발자 확장성 |
새 동적 Access Control 솔루션에 대한 일부 개발자 확장성 지점에 대한 기본 방향입니다. |