1
보안 설계
diadmin edited this page 2026-10-26 18:04:37 +00:00
보안 설계
1. 마스터 암호 2개
| 구분 | 내장 암호 | 사용자 지정 암호 |
|---|---|---|
| 변경 | 불가 | [암호 변경] 버튼으로 변경 |
| 보관 위치 | 소스 코드 안 (해시만) | 레지스트리 HKLM (해시만) |
| 처음 상태 | 항상 있음 | 없음 (처음 변경할 때 생김) |
| 원문 기록 | 어디에도 없음 | 어디에도 없음 |
- 입력한 암호가 둘 중 하나와 맞으면 전체 모드가 됩니다.
- 내장 암호는 사용자 지정 암호를 잊었을 때의 비상 열쇠 역할을 합니다.
- 내장 암호의 원문은 이 위키에 적지 않습니다. 소스에도 솔트와 해시만 들어 있어서, 공개 저장소에서 소스를 봐도 원문을 알아낼 수 없습니다.
- 내장 암호를 바꾸려면 새 암호로 솔트와 해시를 다시 만들어
Program.cs의BuiltInSalt,BuiltInHash값을 바꾸고 다시 빌드해야 합니다.
2. 해시 방식
| 항목 | 값 |
|---|---|
| 알고리즘 | PBKDF2 (HMAC-SHA256) — .NET Rfc2898DeriveBytes |
| 반복 횟수 | 100,000 |
| 솔트 | 무작위 16바이트 (암호마다 새로 생성) |
| 해시 길이 | 32바이트 |
| 문자열 인코딩 | UTF-8 |
| 비교 방식 | 고정 시간 비교 (비교 시간으로 내용을 추측하지 못하게) |
해시는 되돌릴 수 없는 방식이라, 레지스트리나 소스를 열어봐도 원래 암호를 꺼낼 수 없습니다. 무차별 대입을 늦추려고 반복 횟수를 크게 잡았습니다.
3. 레지스트리 저장 위치
HKEY_LOCAL_MACHINE\SOFTWARE\WindowsKeyInfo
PasswordSalt REG_BINARY (16바이트)
PasswordHash REG_BINARY (32바이트)
PasswordIterations REG_DWORD (100000)
- 64비트 Windows에서는 64비트 레지스트리 영역에 저장합니다 (WOW6432Node 아님).
HKLM이라 PC 전체에서 하나의 사용자 지정 암호를 함께 씁니다. 쓰려면 관리자 권한이 필요합니다.- 사용자 지정 암호를 없애려면(내장 암호만 쓰게 하려면) 관리자 권한으로 위 키를 삭제하면 됩니다.
4. 암호 변경 흐름
- 전체 모드에서 [암호 변경] → 새 암호를 한 번 입력 → [저장]
- 프로그램이 일반 권한 상태에서 솔트와 해시를 먼저 만듭니다. 원문 암호는 다른 프로세스로 넘기지 않습니다.
- 자기 자신을 관리자 권한으로 다시 실행합니다:
WindowsKeyInfo.exe --set-password <솔트 Base64> <해시 Base64> - 관리자 프로세스는 화면 없이 레지스트리에 값만 쓰고 종료합니다.
- 원래 창이 종료 코드를 보고 결과를 알려줍니다.
| 종료 코드 | 의미 |
|---|---|
| 0 | 저장 성공 |
| 1 | 레지스트리 쓰기 실패 |
| 2 | 전달된 솔트·해시 형식 오류 |
| (UAC 취소) | "관리자 권한 요청이 취소되었습니다" 안내 |
평소에는 일반 권한으로 실행되고, UAC 창은 암호를 바꿀 때만 뜹니다.
5. 잠금 화면을 티 나지 않게 만든 부분
- 처음 창에는 입력칸이 보이지 않습니다. 입력칸은 창 바깥 좌표에 숨겨져 있습니다.
- 틀린 암호도 빈 값처럼 조용히 제한 모드로 엽니다.
- 처음 창에서 [확인]을 마우스로 눌러도 입력이 다시 숨은 칸으로 가도록 처리했습니다.
- 숨은 칸은 복사·붙여넣기 단축키를 막아 두었습니다.
- 다만 제한 모드의 Ctrl+Shift+P 창은 일부러 보이는 창이고, 틀리면 "암호가 틀렸습니다"라고 알려줍니다.
6. 암호 입력 때 영문 입력 자동 전환
한글 상태에서 암호를 치면 틀리기 쉬워서, 암호 입력칸 3곳에 자동 전환을 넣었습니다.
적용 위치: 처음 "Windows Key" 창(숨은 칸), Ctrl+Shift+P 창, 암호 변경 창 적용 안 함: 확인 ID 입력 창 (숫자만 입력)
입력칸에 들어가면:
- 영어 키보드가 설치돼 있으면 영어 키보드로 전환
- 없으면 한국어 키보드의 IME를 영문 모드로 전환 (
imm32.dll) - Caps Lock이 켜져 있으면 끔
입력칸을 벗어나거나 창이 닫히면 원래 키보드로 복구합니다. Caps Lock은 꺼진 상태로 둡니다.
7. 알려진 한계
- 서명이 없는 exe라서 누군가 exe를 바꿔치기해도 알아차리기 어렵습니다. 공식 배포본은 Gitea 릴리스의 파일만 쓰세요.
- 관리자 권한을 가진 사람은 레지스트리 키를 지워 사용자 지정 암호를 없앨 수 있습니다. 내장 암호는 그대로 동작합니다.
- 잠금은 화면 표시를 제한하는 장치입니다. 키 정보 자체는 Windows 레지스트리에 있으므로, 다른 도구로 읽는 것까지 막지는 못합니다.