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. 암호 변경 흐름

  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 레지스트리에 있으므로, 다른 도구로 읽는 것까지 막지는 못합니다.