Ubuntu 가 사용자 로그 인 비밀 번 호 를 어떻게 저장 하 는 지 탐구 하 다

4001 단어
Ubuntu 시스템 의 / etc 디 렉 터 리 아래 세 개의 사용자 로그 인 액세스 제어 와 관련 된 파일 이 있 습 니 다: passwd, shadow, group.예전 에 오래된 유 닉 스 시스템 은 해시 처 리 된 비밀 번 호 를 passwd 파일 에 직접 넣 었 고 현재 * nix 는 처 리 된 비밀 번 호 를 shadow 파일 에 넣 었 습 니 다. 이 세 파일 의 용 도 는 참고 할 수 있 습 니 다.http://blog.sina.com.cn/s/blog_5edae1a101017gfn.html
   / etc / shadow 파일 을 여 는 내용 은 다음 과 같 습 니 다.
   "$6 $" 부터 "GJr." 까지 이 문자 가 해시 처 리 된 사용자 암 호 를 볼 수 있 습 니 다. 이 문자열 이 어떻게 생 성 되 었 는 지 알 고 싶 습 니 다. 우 분투 공식 문 서 를 살 펴 보 았 습 니 다.
shadow 파일 설명:http://manpages.ubuntu.com/manpages/karmic/man5/shadow.5.html
crypt 암호 화 알고리즘 설명:http://manpages.ubuntu.com/manpages/karmic/man3/crypt.3.html
   공식 문서 에서 사용자 비밀 번 호 는 glibc 의 crypt 알고리즘 을 통 해 처 리 된 것 을 알 수 있 습 니 다. "$6 $3rhg 9. la $" 는 해시 과정 에서 사용 되 는 소금 값 입 니 다. 그러면 소금 값 은 어떤 역할 을 합 니까?우 리 는 이미 알 고 있 는 해시 알고리즘 과 고정된 문자열 에 있어 해시 의 결 과 는 같다 는 것 을 알 고 있다. 그러면 한 시스템 에 많은 사용자 가 있다 고 가정 하면 그 중의 일부 사용 자 는 같은 비밀 번 호 를 사용 할 수 있다. 예 를 들 어 두 사람 이 모두 '123456' 을 로그 인 비밀번호 로 사용 하면 소금 값 을 사용 하지 않 는 상황 에서처 리 된 암호 문자열 은 같 습 니 다.'불법 * * * 자' 는 처 리 된 문자열 에서 명문 비밀 번 호 를 직접 받 을 수 없 지만, 여전히 두 사람 이 같은 비밀 번 호 를 사용 했다 는 사실 을 알 수 있다.이러한 상황 을 피하 기 위해 서 우 리 는 사용자 의 비밀 번 호 를 해시 할 때 원본 비밀번호 뒤에 소금 값 (m / salt) 을 붙 일 수 있 습 니 다. 이렇게 하 는 장점 은 두 가지 가 있 습 니 다. 한편, 소금 값 이 무 작위 로 생 겨 서 같은 암호 에 동의 하 는 해시 값 이 생기 지 않도록 하 는 것 입 니 다.다른 한편 으로 는 * * 자 폭력 해독 의 계산 복잡 도 (2 ^ | salt | 배 증가) 를 증가 시 켰 다."$6 $3rhg 9. la $" 는 두 부분 으로 나 뉘 는데 그것 이 바로 "6" 과 "3rhg 9. la" 입 니 다. 첫 번 째 매개 변 수 는 해시 알고리즘 선택 매개 변수 입 니 다. 공식 문서 에서 언급 했 듯 이 두 번 째 는 무 작위 로 생 성 된 문자열 입 니 다.
   python 자체 crypt 알고리즘 은 glibc 의 crypt 알고리즘 을 호출 할 수 있 습 니 다. python 소스 파일 의 lib 디 렉 터 리 에 있 는 crypt. py 파일 을 열 면 python 이 glibc 의 crypt 알고리즘 을 호출 하 는 과정 을 볼 수 있 습 니 다.
def crypt(word, salt=None):
    """Return a string representing the one-way hash of a password, with a salt
    prepended.
    If ``salt`` is not specified or is ``None``, the strongest
    available method will be selected and a salt generated.  Otherwise,
    ``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as
    returned by ``crypt.mksalt()``.
    """
    if salt is None or isinstance(salt, _Method):
        salt = mksalt(salt)
    return _crypt.crypt(word, salt)

   glibc 원본 파일 의 crypt 디 렉 터 리 에 있 는 crypt - entry. c 파일 을 열 면 소금 값 앞의 세 글자 에 따라 해시 알고리즘 을 선택 한 코드 를 볼 수 있 습 니 다.
/* Define our magic string to mark salt for MD5 encryption
   replacement.  This is meant to be the same as for other MD5 based
   encryption implementations.  */
static const char md5_salt_prefix[] = "$1$";
/* Magic string for SHA256 encryption.  */
static const char sha256_salt_prefix[] = "$5$";
/* Magic string for SHA512 encryption.  */
static const char sha512_salt_prefix[] = "$6$";
/* For use by the old, non-reentrant routines (crypt/encrypt/setkey)  */
extern struct crypt_data _ufc_foobar;

   테스트 과정 에서 가장 먼저 다운로드 한 것 은 glibc 2.6 입 니 다. 이 버 전 은 $5 $와 $6 $에 대응 하 는 sha 256 / sha 512 알고리즘 이 없습니다. MD5 만 다운로드 한 다음 에 최신 glibc 2.18 버 전 을 다운로드 한 후에 야 이 두 알고리즘 을 보 았 습 니 다. glibc 2.6 버 전과 이전 버 전의 Liux 시스템 에서 shadow 파일 은 지금 이 아 닙 니 다.이 Ubuntu 시스템 의 gblic 버 전 은 2.11 (ldd -- version 보기) 이 며, 이 버 전 glibc 도 sha 256 / sha 512 를 지원 합 니 다.우리 가 제시 한 예 에서 앞의 세 글 자 는 "$6 $" 입 니 다. 우 리 는 시스템 이 사용 하 는 해시 알고리즘 이 sha 512 라 는 것 을 알 수 있 습 니 다.python 은 glibc 의 crypt 알고리즘 을 호출 하기 때문에 windows 플랫폼 에서 python 의 이 알고리즘 은 호출 할 수 없다 는 것 을 알 수 있 습 니 다.현재 python 을 사용 하여 스 크 립 트 를 써 서 테스트 합 니 다:
crypt 함수 에 두 개의 인 자 를 입력 하 십시오. 하 나 는 로그 인 비밀번호 이 고, 다른 하 나 는 소금 값 입 니 다. 출력 결 과 는 shadow 파일 에서 처 리 된 암호 문자열 과 같 습 니 다.
   shadow 파일 은 기본적으로 루트 사용자 만 접근 할 수 있 습 니 다. 일반 사용 자 는 접근 권한 이 없습니다. 불법 * * * 자 는 일정한 경 로 를 통 해 이 파일 을 얻 은 후 폭력 적 으로 비밀 번 호 를 시도 하면 원본 명문 비밀 번 호 를 얻 을 수 있 습 니 다. 따라서 사용 자 는 비밀 번 호 를 설정 할 때 다양한 문자 (대소 문자, 숫자, 특수 기호) 를 포함 하고 일정한 길 이 를 초과 합 니 다.이로써 시스템 의 안전성 을 높이다.
다음으로 전송:https://blog.51cto.com/ciphertext/1275485

좋은 웹페이지 즐겨찾기