은행 현장의 언어 · 누가 언제 무엇을 바꿨는가 · 실습
한도를 올린 사람을 증명하기
목표
제자리 UPDATE 로 사라진 증거를 숫자로 드러내고, 정규 직렬화와 해시 사슬로 추가만 되는 감사 기록을 만든 뒤, 협력사 반출본의 변조를 찾아내고 HMAC 과 상관 ID 까지 붙여 증적 묶음을 냅니다.
왜 중요한가
감사에서 다투는 것은 값이 아니라 경위입니다. 현재 한도만 저장하는 시스템은 "누가 언제 왜 올렸나" 에 답할 수 없고, 그 답이 없으면 맞는 값도 설명할 수 없는 값이 됩니다.
해시 사슬은 기록을 고칠 수 없게 만드는 장치가 아니라 고치면 드러나게 만드는 장치입니다. 그래서 같은 사건이 늘 같은 바이트가 되는 정규 직렬화가 먼저 필요하고, 사슬을 통째로 다시 계산하는 위조를 막으려면 열쇠가 필요합니다.
채점기는 여러분이 적어 낸 해시를 믿지 않습니다. 원본에서 처음부터 다시 계산해 대조하고, 실행마다 다른 난수 벡터와 새로 만든 사슬로 여러분의 도구를 시험합니다.
단계
1. 재료 스크립트를 /root/audit/gen_audit.py 로 저장해 실행하고 /root/audit/core.db 와 /root/audit/vendor_chain.jsonl 을 만듭니다.
2. 월초 스냅샷과 현재 한도를 대사해 사라진 증거를 /root/audit/lost.txt 에 changed·ticketed·untraceable·mismatched·raised_total 로 적습니다.
3. /root/audit/canon.py 를 만들어 표준 입력의 JSON 줄마다 정규 직렬화한 바이트의 sha256 을 한 줄씩 냅니다.
4. /root/audit/build_chain.py 로 app_log 400줄을 /root/audit/audit.db 의 audit_log 표에 해시 사슬로 옮깁니다.
5. /root/audit/verify_chain.py 로 협력사 반출본을 검증하고 찾은 자리를 /root/audit/tamper.txt 에 적습니다.
6. /root/audit/hmac.key 와 /root/audit/mac_chain.py 로 사슬 위에 MAC 을 얹어 /root/audit/audit_mac.jsonl 을 만듭니다.
7. 상관 ID 로 사건을 요청 단위로 되묶어 /root/audit/corr.txt 에 적습니다.
8. /root/audit/evidence/manifest.json 과 /root/audit/audit_report.md 로 증적 묶음을 냅니다.
참고
- 감사 기록의 해시 규칙: seq·ts·corr_id·actor·action·target·amount·prev_hash 여덟 키를 정규 직렬화한 바이트의 sha256 입니다. 첫 항목의 prev_hash 는 0 예순네 개입니다.
- 협력사 사슬의 해시 규칙은 다릅니다: prev_hash, seq, ts, actor, action, target, amount 를 이 순서로 세로막대 하나로 이은 문자열의 sha256 입니다.
- MAC 규칙: entry_hash·prev_mac·seq 세 키를 정규 직렬화한 바이트에 HMAC-SHA256 이고, 열쇠는 파일에 적힌 16진수 문자열의 ASCII 바이트를 그대로 씁니다.
- verify_chain.py 의 출력 계약: 문제마다 한 줄로
BAD seq=<번호> reason=content|link|missing, 깨끗하면OK lines=<줄수>와 종료 코드 0, 문제가 있으면 1 입니다. - sqlite3 는
sqlite3 -readonly /root/audit/core.db "SELECT ..."로 붙습니다. 파이썬에서는sqlite3.connect("file:/root/audit/core.db?mode=ro", uri=True)입니다. - 흔한 실수: json.dumps 의 기본값(ensure_ascii=True)으로 한글을 이스케이프해 버리기, 사슬 첫 항목의 prev_hash 를 빈 문자열로 두기, 열쇠 파일을 644 로 두기.
단계 8개
- 한도 스냅샷과 협력사 반출본 만들기
- 제자리 UPDATE 가 지운 것을 세기
- 같은 사건을 늘 같은 바이트로 만들기
- 로그 400줄을 해시 사슬로 묶기
- 협력사 반출본에서 손이 탄 자리 찾기
- 사슬 위에 열쇠를 얹기
- 사건 하나를 요청 하나로 되묶기
- 증적 묶음과 보고서 내기