[Linux]비밀번호의 암호화 알고리즘 및 솔트(salt)에 관하여
리눅스를 시작하게 되면 가장 먼저 소개되는 파일 중의 하나가 /etc/shadow 파일일 겁니다. 암호의 사용 기간 정보와 함께 암호화된 비밀번호를 저장하는 파일입니다.
아래 이미지는 /etc/shadow 파일의 필드 포맷에 대한 설명입니다. 암호화와 관련된 항목에 대해서는 더 자세히 알아보겠습니다.

출처: https://forum.myvestacp.com/viewtopic.php?t=518
- $id$: 사용한 암호화 알고리즘 ID입니다.
-$1$: MD5
-$5%:SHA-256
-$6$: SHA-512
– $2$, $3$, $4$는 사용하지 않는다고 하네요. - $salt$: Salt 값을 생성할 때에는 보안성을 높이기 위해 무작위성과 예측 불가능성이 중요합니다. 보통 운영체제나 암호학적으로 안전한 랜덤 넘버 생성기를 사용하여 salt 값을 생성합니다. 사용자의 입력된 비밀번호와 함께 해시함수로 암호화되어 저장됩니다.
– 패스워드 암호화 강도를 높이기 위한 값
– 사용자가 지정한 비밀번호에 서로 다른 salt값을 적용한다
– 같은 계정이 동일한 비밀번호를 사용해도 salt값에 따라 해시 값이 달라진다.일반적으로 비밀번호는 해시 함수에 직접 입력되어 해시값으로 저장됩니다. 그러나 동일한 비밀번호는 항상 동일한 해시값을 생성하므로, 레인보우 테이블 공격과 같은 사전 공격을 통한 공격에 취약할 수 있습니다. 솔트를 사용하면 동일한 비밀번호(평문)도 사용자별 각각 다른 솔트 값을 적용하여 서로 다른 해시값이 생성됩니다. 반대로 해시값이 동일하더라고 솔트 값이 다르기 때문에 전혀 다른 비밀번호를 가지게 됩니다. 이렇게 하면 레인보우 테이블 공격이나 사전 공격을 어렵게 만들어줍니다. 각 사용자에게 고유한 솔트 값을 부여하면 모든 사용자의 비밀번호가 서로 다르게 해싱되므로, 같은 비밀번호를 사용하더라도 다른 해시값을 갖게 됩니다. 솔트를 사용하면 해시된 비밀번호를 안전하게 저장할 수 있으며, 보안성을 향상시킵니다. chpassword -c 알고리즘 사용자ID:비밀번호
명령어를 사용하면 암호화 알고리즘($id$)를 지정하여 비밀번호를 암호화할 수 있습니다.
– 사용 가능한 알고리즘 옵션: DES, MD5, NONE, SHA256, SHA512[root@centos8 ~]cat /etc/shadow | grep jeusjeus:$6$q/iB/mc0clUVUnSd$ocGI/qB9U8bz5ru/F0DKXw.sVndYs2rJGlHc8rtc19XvQnD2XRUhp7fQPJRM86YdpNbM1sV8pJMr0ygabsLAi0:19706:0:99999:7:1::[root@centos8 ~]echo "jeus:init123456" | chpasswd -c NONE[root@centos8 ~]cat /etc/shadow | grep jeusjeus:init123456:19730:0:99999:7:1::[root@centos8 ~]echo "jeus:init123456" | chpasswd -c SHA256[root@centos8 ~]cat /etc/shadow | grep jeusjeus:$5$u8BUFk6pqtRz6Zm$4axpyXUx3t9r0mZY3e1BKhSTUD5AAXom.aGN6XVeAJ/:19730:0:99999:7:1::[root@centos8 ~]# echo "jeus:init123456" | chpasswd -c DES[root@centos8 ~]# cat /etc/shadow | grep jeusjeus:Es5WrZY.fR/fc:19730:0:99999:7:1::- 디폴트 암호화 알고리즘 SHA512($6$)는 /etc/login.defs 파일에 지정되어 있습니다.
– “ENCRYPT_METHOD SHA512” - SHA256 알고리즘($5$)으로 어떻게 비밀번호가 암호화되는지 간략하게 알아보겠습니다.
- 비밀번호 입력: “init123456”
- 솔트(salt) 생성: u8BUFk6pqtRz6Zm
- 비밀번호와 솔트 접합: init123456u8BUFk6pqtRz6Zm
- SHA256 알고리즘($5$)으로 암호화: 4axpyXUx3t9r0mZY3e1BKhSTUD5AAXom.aGN6XVeAJ/
함께 읽어보면 좋은 Contents
- Linux서버 취약점 분석/조치법 > 패스워드 복잡성 설정
- [Linux]비밀번호의 암호화 알고리즘 및 솔트(salt)에 관하여
- [Linux]사용자 정보 변경 명령어들의 필수 옵션 추가 정리
- [Linux]권한 및 소유권 관리를 위한 리눅스 명령어들
- [Linux]사용자와 그룹 관리를 위한 리눅스 명령어 및 관련 파일들 총정리