주기적으로 새로운 암호를 만들어야 하는데, 그중에는 더 높은 보안 수준이 요구되는 것도 있습니다. 새 로그인 계정을 만들어야 할 때면 머릿속이 하얘지곤 하는데, 이 짧은 Bash 스크립트가 바로 그 빈자리를 채워 줍니다. 솔직히 말하자면, 이 스크립트의 대부분은 어디선가 발견한 코드를 가져와 살짝 수정한 것이지만, 실제로 매우 유용하게 쓰고 있습니다.
암호 생성 스크립트 전체 코드
#!/usr/bin/env sh
echo 'Generating 12-character passwords'
for ((n=0;n<12;n++))
do dd if=/dev/urandom count=1 2> /dev/null | uuencode -m - | sed -ne 2p | cut -c-12
done
스크립트 작동 원리
모든 세부 사항을 완벽히 이해하고 있지는 않지만, 어느 정도 조사하고 실험해 본 결과를 바탕으로 설명해 보겠습니다. 스크립트의 핵심은 do dd로 시작하는 줄에 있습니다. dd 명령어는 흔히 디스크 간 복제에 사용되지만, 여기서는 /dev/urandom으로부터 한 블록의 무작위 문자를 생성하는 데 활용됩니다. dd가 출력하는 피드백 메시지는 제거되고, 생성된 문자들은 uuencode로 전달됩니다. uuencode는 모든 문자를 출력 가능한 형태(즉, 제어 문자가 포함되지 않은 형태)로 변환하는 역할을 맡습니다.
uuencode 명령어는 sharutils 패키지를 설치하면 사용할 수 있습니다.
sed는 대문자와 소문자가 골고루 섞이도록 추가 변환을 수행하는 것으로 보입니다. 마지막으로 cut이 문자열을 잘라내어 최종적으로 12자리 암호를 완성합니다. for 루프가 12번 반복되기 때문에, 스크립트를 한 번 실행하면 12개의 암호를 얻을 수 있습니다.
실행 결과 예시
Generating 12-character passwords
8WMKHeXeYsND
X+V3jWOuBWwp
fSk6inI+LfYP
hIPndcBOSh7m
bb/w9mx8OlHv
hdIOibUaMt3Y
wl//CobIG5bR
dih0qQQMJiXw
BIN2QfNA4jCe
DF0c8Auz1qL4
RM8MMq/D8C8H
rZIG5hbghcMy
예시 출력에서 알파벳 대소문자와 숫자가 적절히 뒤섞인 것을 확인할 수 있습니다. 한 가지 눈여겨볼 점은 영숫자가 아닌 특수문자가 /와 +뿐이라는 사실입니다.
생성된 암호 활용 방법
새 암호가 필요할 때 저는 이 출력 목록에서 눈에 들어오는 것 하나를 고릅니다. 자주 사용할 암호라면 언젠가 기억해 낼 수 있을 만한 것을 선호하는 편입니다.
물론 생성된 암호를 그대로 쓸 필요는 전혀 없습니다. 원하는 대로 문자를 추가하거나 수정하면 됩니다. 저는 주로 8자리 암호를 사용하는데, 일부 서비스에서는 최소 하나의 소문자, 대문자, 숫자, 특수문자를 포함하도록 요구하기 때문에 그에 맞게 조정하면 됩니다.
마음에 드는 암호가 하나도 없다면 스크립트를 다시 실행해서 새로운 12개를 뽑아 보면 됩니다. /dev/urandom은 엄밀히 말해 의사난수(pseudo-random number)만 생성한다고 지적하는 분도 계시겠지만, 사람이 머리로 짜내는 암호보다는 훨씬 안전하고 규칙적인 결과를 보장해 줍니다.