암호화 지식 (개발자를 위한 가이드)

현대 소프트웨어 개발에서 암호화는 필수적인 보안 요소입니다. 이 글에서는 개발자가 알아야 할 핵심 암호화 개념과 실제 구현 시 고려사항을 다룹니다. 암호화 알고리즘 선택 시 고려사항 암호화 구현 시 다음 요소들을 신중히 고려해야 합니다: 대칭형 vs 비대칭형 암호화 알고리즘 종류와 보안 강도 운영 모드의 특성과 용도 패딩 방식 키 관리 전략 성능과 보안의 균형 대칭형 vs 비대칭형 암호화 대칭형 암호화 정의: 동일한 키로 암호화와 복호화를 수행 장점: 빠른 처리 속도 적은 컴퓨팅 리소스 요구 대용량 데이터 처리에 적합 단점: 키 공유의 어려움 많은 통신 상대와의 키 관리 복잡성 비대칭형 암호화 정의: 공개키와 개인키를 사용하는 방식 장점: 안전한 키 교환 디지털 서명 가능 부인 방지 기능 단점: 느린 처리 속도 높은 컴퓨팅 리소스 요구 주요 대칭형 블록 알고리즘 DES (Data Encryption Standard) 블록 크기: 64비트 키 길이: 56비트 특징: 역사적으로 중요한 알고리즘 현재는 보안 강도 부족으로 새로운 시스템에는 권장되지 않음 레거시 시스템 호환성을 위해 알아둘 필요 있음 3-DES (Triple DES) 키 길이: 2-키 3-DES: 112비트 3-키 3-DES: 168비트 특징: DES를 3회 적용하여 보안성 향상 DES 대비 약 3배 느린 처리 속도 여전히 안전하나 점차 AES로 대체 중 AES (Advanced Encryption Standard) 블록 크기: 128비트 키 길이: 128/192/256비트 특징: 현대 암호화의 표준 뛰어난 성능과 보안성 하드웨어 가속 지원으로 고성능 권장 사용 사례: 새로운 시스템 개발 시 기본 선택 클라우드 서비스의 데이터 암호화 금융 거래 보안 SEED 블록 크기: 128비트 키 길이: 128비트 특징: 한국 표준 암호화 알고리즘 국제 표준 인증 국내 공공기관 시스템에서 널리 사용 주요 비대칭형(공개키) 알고리즘 RSA (Rivest-Shamir-Adleman) 키 길이: 2048/3072/4096비트 권장 특징: 가장 널리 사용되는 비대칭 암호화 알고리즘 소인수분해의 어려움을 기반으로 한 보안성 디지털 서명과 암호화 모두 지원 장점: 구현이 상대적으로 단순 높은 보안성 폭넓은 라이브러리 지원 단점: 긴 키 길이 필요 느린 처리 속도 주요 용도: SSL/TLS 인증서 디지털 서명 키 교환 ECC (Elliptic Curve Cryptography) 키 길이: 256/384/521비트 특징: 타원곡선의 이산대수 문제를 기반 RSA 대비 짧은 키 길이로 동등한 보안성 제공 장점: 짧은 키 길이 빠른 처리 속도 낮은 리소스 요구사항 단점: 구현의 복잡성 특허 문제 (일부 알고리즘) 주요 용도: 모바일 기기의 암호화 IoT 디바이스 블록체인/암호화폐 DSA (Digital Signature Algorithm) 키 길이: 2048/3072비트 권장 특징: 디지털 서명 전용 알고리즘 NIST FIPS 186 표준 장점: 서명 생성이 RSA보다 빠름 미국 정부 표준 단점: 서명 검증이 RSA보다 느림 암호화 기능 없음 주요 용도: 전자서명 인증서 서명 ElGamal 특징: 이산대수의 어려움을 기반 DSA의 기반이 되는 알고리즘 장점: 학술적 검증이 잘된 알고리즘 확률적 암호화로 높은 보안성 단점: 암호문 크기가 평문의 2배 처리 속도가 느림 주요 용도: PGP 등의 암호화 시스템 하이브리드 암호 시스템 블록 암호화 운영 모드 ECB (Electronic Codebook) 동작 방식: 각 블록을 독립적으로 암호화 장점: 단순한 구현 병렬 처리 가능 단점: 패턴이 그대로 노출될 수 있음 데이터 무결성 보장 없음 사용 권장 사례: 매우 짧은 데이터 (단일 블록) 암호화 키 자체의 암호화 CBC (Cipher Block Chaining) 동작 방식: 이전 블록의 암호문과 현재 평문을 XOR 특징: IV(Initial Vector) 필요 순차적 처리 필요 장점: 높은 보안성 오류 전파 제한적 사용 권장 사례: 일반적인 데이터 암호화 메시지 인증이 필요한 경우 기타 운영 모드 CFB (Cipher Feedback) 스트림 암호처럼 동작 실시간 암호화에 적합 OFB (Output Feedback) 미리 키스트림 생성 가능 노이즈가 많은 채널에 적합 CTR (Counter) 병렬 처리 가능 랜덤 액세스 가능 패딩 (Padding) 방식 NO_PADDING 패딩 없음 데이터가 블록 크기의 배수일 때만 사용 가능 ZEROS_PADDING 남는 공간을 0으로 채움 구현이 단순하나 특정 상황에서 모호성 발생 가능 PKCS7_PADDING (DEFAULT_PADDING) 가장 널리 사용되는 표준 패딩 방식 패딩 바이트 값이 패딩 길이와 동일 예시: 블록 크기: 8바이트 데이터: "HELLO" 패딩 후: "HELLO\x03\x03\x03" ONE_AND_ZEROS_PADDING 첫 바이트는 0x80, 나머지는 0x00 패딩의 시작과 끝이 명확함 하이브리드 암호 시스템 실제 응용에서는 대칭형과 비대칭형 암호화를 결합하여 사용하는 경우가 많습니다. ...

August 13, 2021 · Byung Kyu KIM

CMake Basic

Effective Modern CMake Effective Modern CMake : https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1{:target="_blank"} CMakeLists.txt : Basic Template cmake_minimum_required(VERSION 3.11) project(main) set(CMAKE_CXX_STANDARD 17) add_executable(main main.cpp) target_compile_options(main PRIVATE -Wall -O2) # target_include_directories(main PRIVATE ) # target_link_directories(main PRIVATE ) # target_link_libraries(main PRIVATE -pthread) CMake Generate, Build Windows $ mkdir build && cd build # Generate $ cmake -G "Visual Studio 16 2019" -A x64 .. # Build $ cmake --build . --config Release MinGW choco install winlibs -y mingw 패키지에 비해 버전 및 안정성 좋음 $ mkdir build && cd build # Generate $ cmake -G "MSYS Makefiles" .. # Build 1 $ cmake --build . # Build 2 $ make Linux $ mkdir build && cd build # Generate $ cmake .. # Build $ make Generators $ cmake -G CMake Error: No generator specified for -G Generators Visual Studio 17 2022 = Generates Visual Studio 2022 project files. Use -A option to specify architecture. * Visual Studio 16 2019 = Generates Visual Studio 2019 project files. Use -A option to specify architecture. Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files. Optional [arch] can be "Win64" or "IA64". Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files. Optional [arch] can be "Win64" or "IA64". Borland Makefiles = Generates Borland makefiles. NMake Makefiles = Generates NMake makefiles. NMake Makefiles JOM = Generates JOM makefiles. MSYS Makefiles = Generates MSYS makefiles. MinGW Makefiles = Generates a make file for use with mingw32-make. Green Hills MULTI = Generates Green Hills MULTI files (experimental, work-in-progress). Unix Makefiles = Generates standard UNIX makefiles. Ninja = Generates build.ninja files. Ninja Multi-Config = Generates build-<Config>.ninja files. Watcom WMake = Generates Watcom WMake makefiles. CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files. CodeBlocks - NMake Makefiles = Generates CodeBlocks project files. CodeBlocks - NMake Makefiles JOM = Generates CodeBlocks project files. CodeBlocks - Ninja = Generates CodeBlocks project files. CodeBlocks - Unix Makefiles = Generates CodeBlocks project files. CodeLite - MinGW Makefiles = Generates CodeLite project files. CodeLite - NMake Makefiles = Generates CodeLite project files. CodeLite - Ninja = Generates CodeLite project files. CodeLite - Unix Makefiles = Generates CodeLite project files. Eclipse CDT4 - NMake Makefiles = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - MinGW Makefiles = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files. Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files. Kate - MinGW Makefiles = Generates Kate project files. Kate - NMake Makefiles = Generates Kate project files. Kate - Ninja = Generates Kate project files. Kate - Unix Makefiles = Generates Kate project files. Sublime Text 2 - MinGW Makefiles = Generates Sublime Text 2 project files. Sublime Text 2 - NMake Makefiles = Generates Sublime Text 2 project files. Sublime Text 2 - Ninja = Generates Sublime Text 2 project files. Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files.

August 12, 2021 · Byung Kyu KIM

SQLAlchemy Query Basic (w/Flask)

Flask 에서 SQLAlchemy 사용시 Query 팁 설정 Connection 기본 DBMS 연결 정보 # MySQL app.config['SQLALCHEMY_DATABASE_URI'] = r'mysql+pymysql://user:passwd@address:3306/db_name?charset=UTF8MB4' db = SQLAlchemy() db.init_app(app) Bind 추가 기본 DBMS 이외, 추가적인 DB 정보 추가 app.config['SQLALCHEMY_BINDS'] = { 'dbms1': r'mysql+pymysql://user:passwd@address1:3306/db_name?charset=UTF8MB4', 'dbms2': r'mysql+pymysql://user:passwd@address2:3306/db_name?charset=UTF8MB4' } # Model Example class Network(db.Model): __tablename__ = 'network' __bind_key__ = 'dbms1' ip = db.Column(db.String(128), primary_key=True) switch = db.Column(db.String(128)) doc = db.Column(db.JSON) AlchemyEncoder SQLAlchemy JSON Encoder class AlchemyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj.__class__, DeclarativeMeta): # an SQLAlchemy class fields = {} for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']: data = obj.__getattribute__(field) try: json.dumps(data) # this will fail on non-encodable values, like other classes fields[field] = data except TypeError: if isinstance(data, datetime): fields[field] = data.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(data, date): fields[field] = data.strftime('%Y-%m-%d') else: fields[field] = None return fields return json.JSONEncoder.default(self, obj) Flask Basic Route @app.route('/api/network/') def api_network(): cur = db.session.query(Network) return json.dumps({ 'data': cur.all() }, cls=AlchemyEncoder) DB Model Generate # 해당 DB 전체 Table 대상 $ ./venv/bin/flask-sqlacodegen 'mysql+pymysql://user:passwd@address2:3306/db_name' --flask # 해당 DB 테이블 지정 $ ./venv/bin/flask-sqlacodegen 'mysql+pymysql://user:passwd@address2:3306/db_name' --flask --table network,other_table Query Sample Select All cur = db.session.query(Network) Select Filter, Sort # Filter cur = db.session.query(network).filter(network.switch == switch_name) cur = db.session.query(network).filter(network.ip.like('{}%'.format(ip))) cur = db.session.query(network).filter(network.switch.in_(('AA', 'BB'))) # Text filter, json cur = db.session.query(network).filter(text(r'''doc->>"$.name" <> '' ''')) # OR cur = db.session.query(network).filter(or_(network.ip == ip, network.switch == switch_name)) # AND cur = db.session.query(network).filter(and_(network.ip == ip, network.switch == switch_name)) # SORT cur = db.session.query(network).filter(network.switch == switch_name) \ .order_by(network.ip.desc()) Join # Join cur = db.session.query(Network, NetworkSwitch) \ .filter(Network.ip == NetworkSwitch.ip, Network.switch == NetworkSwitch.switch) # Outer Join cur = db.session.query(Network) \ .outerjoin(NetworkSwitch, and_(Network.ip == NetworkSwitch.ip, Network.switch == NetworkSwitch.switch)) # Self Join, Table Alias NetworkAlias = aliased(Network) cur = db.session.query(Network, NetworkAlias) \ .filter(Network.ip == NetworkAlias.ip, Network.switch == NetworkAlias.switch)

August 12, 2021 · Byung Kyu KIM