TIL #10 [Django] 암호화 & 인증(Authentication)

ahn__jh·2021년 4월 7일
0

사용자의 비밀번호를 그대로 저장하게 될 경우

  • 만일 DB가 해킹 당할경우 비밀번호가 그대로 노출됨.
  • 사용자의 비밀번호가 암호화되지 않고 노출되어 저장된다면 서버의 내부인력,혹은 개발자가 악용할 수 있으므로 꼭 암호화 하여야함
  • 유저의 비밀번호를 암호화 하는 이유

  • DB가 해킹 당하더라도 유저의 비밀번호가 암호화 되어 그대로 노출되어 악용할수 없게 시간을 벌어줌
  • 내부 인력도 비밀번호를 알 수가 없음

  • 단방향 해시함수

    단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메세지를 생성한다
    원본 메시지를 알면 암호화되기전 원본 메시지를 알 수 있지만 암호화된메시지로 원본 메시지를 구할 수 없어서 단방향성(one-way) 이라고 한다.

    단방향 해시함수의 취약점

    해시되는 처리속도가 매우 빨라 이점을 악용해 미리 여러 문자들의 해시값을 구해놓은 Rainbow table attack에 취약하다.
    또한 한 사용자의 비밀번호는 대부분 똑같거나 비슷하기 때문에 더욱 취약함

    단방향 해시함수의 취약점을 보완할 방법

  • Key Stretching - KEY STRETCHING 암호화를 한 비밀번호를 해킹하기위해 컴퓨팅하는시간을 오래걸리게해서 그이전에 비밀번호 변경으로 해킹당하는것을 최소화 할 수 있다.
  • Salting - 해시된 암호에 무작위 값을 추가해 해시하는 방법

  • 해시방법

    1. 가상환경 ON
    2. bcrypt 설치
    3. bcrypt 모듈 불러옴 Import bcrypt
    4. 해시할 문자열 인코딩
    	a = '1234'
    	a = a.encode('utf-8')

    5.password 해시

    	hashed_pw = bcrypt.hashpw(a, bcrypt.gensalt() )

    해시할 변수를 선언하고 그안에 bcrypt.hashpw 해시를 생성하는 함수에 인코딩된 인자 a 와 salt값을 추가 할 bcrypt.gensalt() 를 넣으면 Salt값이 추가된 해시된 비밀번호가 생성된다.

    	b'$2b$12$vYMsKVGrXez8pi3s8HDA5enSwInC/RB7Q0q8ubm2dwV7opATGu5P.'

    DB에 저장시 디코딩 해서 저장해야함!

    해시된암호 비교방법

    	a='1234'		#사용자가 입력한 패드워드
        				#hased_pw는 DB에 저장된 암호화된 패스워드
                        
    	bcrypt.checkpw(a.encode('utf-8'), hashed_pw)
        
        	해쉬된 비밀번호가 일치하면 True
        	일치하지 않다면 False가 출력된다

    DB에서 꺼내어 확인시에는 반드시 인코딩 하여 확인해야함!

    유저의 비밀번호 저장 방법

    1. 유저 아이디와 비밀번호 생성 비밀번호 인코딩
    2. 유저 비밀번호 암호화 해서 디코딩 후 DB에 저장(인코딩 상태로 저장하게되면 byte 상태를 나타내는 해쉬문자열 앞 b까지 문자열로 DB에저장됨 꺼내어 사용시 기존 입력했던 암호와 다른 암호가 되니 주의!)
    3. 유저 로그인 -> 아이디와 비밀번호 입력
    4. 유저가 생성한 비밀번호 인코딩 한후 암호화되서 DB에 저장된 유저 비밀번호와 비교.

    0개의 댓글