위키: 보안 설계
parent
b877394f5b
commit
1adb86275a
|
|
@ -0,0 +1,86 @@
|
||||||
|
# 보안 설계
|
||||||
|
|
||||||
|
## 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. 암호 변경 흐름
|
||||||
|
|
||||||
|
1. 전체 모드에서 **[암호 변경]** → 새 암호를 한 번 입력 → **[저장]**
|
||||||
|
2. 프로그램이 일반 권한 상태에서 솔트와 해시를 먼저 만듭니다. **원문 암호는 다른 프로세스로 넘기지 않습니다.**
|
||||||
|
3. 자기 자신을 관리자 권한으로 다시 실행합니다: `WindowsKeyInfo.exe --set-password <솔트 Base64> <해시 Base64>`
|
||||||
|
4. 관리자 프로세스는 화면 없이 레지스트리에 값만 쓰고 종료합니다.
|
||||||
|
5. 원래 창이 종료 코드를 보고 결과를 알려줍니다.
|
||||||
|
|
||||||
|
| 종료 코드 | 의미 |
|
||||||
|
|---|---|
|
||||||
|
| 0 | 저장 성공 |
|
||||||
|
| 1 | 레지스트리 쓰기 실패 |
|
||||||
|
| 2 | 전달된 솔트·해시 형식 오류 |
|
||||||
|
| (UAC 취소) | "관리자 권한 요청이 취소되었습니다" 안내 |
|
||||||
|
|
||||||
|
평소에는 일반 권한으로 실행되고, UAC 창은 암호를 바꿀 때만 뜹니다.
|
||||||
|
|
||||||
|
## 5. 잠금 화면을 티 나지 않게 만든 부분
|
||||||
|
|
||||||
|
- 처음 창에는 입력칸이 보이지 않습니다. 입력칸은 창 바깥 좌표에 숨겨져 있습니다.
|
||||||
|
- 틀린 암호도 빈 값처럼 조용히 제한 모드로 엽니다.
|
||||||
|
- 처음 창에서 [확인]을 마우스로 눌러도 입력이 다시 숨은 칸으로 가도록 처리했습니다.
|
||||||
|
- 숨은 칸은 복사·붙여넣기 단축키를 막아 두었습니다.
|
||||||
|
- 다만 제한 모드의 Ctrl+Shift+P 창은 일부러 보이는 창이고, 틀리면 "암호가 틀렸습니다"라고 알려줍니다.
|
||||||
|
|
||||||
|
## 6. 암호 입력 때 영문 입력 자동 전환
|
||||||
|
|
||||||
|
한글 상태에서 암호를 치면 틀리기 쉬워서, 암호 입력칸 3곳에 자동 전환을 넣었습니다.
|
||||||
|
|
||||||
|
**적용 위치:** 처음 "Windows Key" 창(숨은 칸), Ctrl+Shift+P 창, 암호 변경 창
|
||||||
|
**적용 안 함:** 확인 ID 입력 창 (숫자만 입력)
|
||||||
|
|
||||||
|
입력칸에 들어가면:
|
||||||
|
1. 영어 키보드가 설치돼 있으면 영어 키보드로 전환
|
||||||
|
2. 없으면 한국어 키보드의 IME를 영문 모드로 전환 (`imm32.dll`)
|
||||||
|
3. Caps Lock이 켜져 있으면 끔
|
||||||
|
|
||||||
|
입력칸을 벗어나거나 창이 닫히면 **원래 키보드로 복구**합니다. Caps Lock은 꺼진 상태로 둡니다.
|
||||||
|
|
||||||
|
## 7. 알려진 한계
|
||||||
|
|
||||||
|
- 서명이 없는 exe라서 누군가 exe를 바꿔치기해도 알아차리기 어렵습니다. 공식 배포본은 Gitea 릴리스의 파일만 쓰세요.
|
||||||
|
- 관리자 권한을 가진 사람은 레지스트리 키를 지워 사용자 지정 암호를 없앨 수 있습니다. 내장 암호는 그대로 동작합니다.
|
||||||
|
- 잠금은 화면 표시를 제한하는 장치입니다. 키 정보 자체는 Windows 레지스트리에 있으므로, 다른 도구로 읽는 것까지 막지는 못합니다.
|
||||||
Loading…
Reference in New Issue