티스토리 뷰
사용자의 비밀번호를 암호화하지 않고 스트링 그대로 저장하는것은 위험하다. 졸업프로젝트를 진행할때는 MD5 방법을 사용했었는데, 안전한 비밀번호 저장에 대해 알아보다가 단방향 암호화 방법의 문제점을 알게되었다.
먼저, 동일한 메시지가 언제나 동일한 다이제스트를 갖기때문에, brute force방법으로 모든 문자열을 암호화한 후 비교해보면 바로 기존 비밀번호가 뭔지 알게 된다. 또한, 짧은 시간대에 데이터를 검색하기 위해 설계된 해시 함수를 사용하기 때문에 처리 속도가 아주 빠르다. 이는 유저뿐만 아니라 해커에게도 좋은 점인데 비밀번호를 알아내기 위해 일치 여부를 확인해볼때, 한번의 시도에 걸리는 시간이 적으니 많은 시도를 해볼 수 있다.
위의 문제점을 해결하기 위한 방법은 솔팅(salting)과 키 스트레칭(key stretching)이다 .
솔팅은 유저의 비밀번호 앞에 임의의 문자열을 추가한 후, 이를 통째로 해시 function에 넣어 다이제스트를 생성하는 방법이다.
키 스트레칭은 생성된 다이제스트를 입력값으로 또 다이제스트를 생성하고, 이를 입력값으로 또 다이제스트를 생성하는 방법이다.
회원가입할때 받은 비밀번호를 이런식으로 n번 반복해서 암호화 해둔 후, 로그인할때 입력받은 비밀번호를 똑같이 n번 반복한 후 기존 비밀번호와 일치하는지 확인해보면 된다. 키 스트레칭은 해시함수를 여러번 적용함으로서 소요되는 시간을 늘려준다.
사용 방법
build.gradle(app)에 추가해준다.
implementation group: 'de.svenkubiak', name: 'jBCrypt', version: '0.4.1'
password라는 비밀번호를 암호화하는 두가지 방법이다. 둘 중 하나만 골라서 사용하면 된다.
위의 방법은 salt를 생성하고 바로 해시함수에 넣고, 밑의 방법은 salt를 생성 후 해시함수에 넣는걸 10번 반복하는것 같다.
아래의 방법이 시간이 더 오래 걸리지만 로그인을 하는 유저의 입장에서는 큰 차이가 느껴지지 않을 정도이고, 보안이 우수해진다.
// 위 비밀번호의 BCrypt 알고리즘 해쉬 생성
// passwordHashed 변수는 실제 데이터베이스에 저장될 60바이트의 문자열이 된다.
val passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt())
// 위 문장은 아래와 같다. 숫자가 높아질수록 해쉬를 생성하고 검증하는 시간은 느려진다.
// 즉, 보안이 우수해진다. 하지만 그만큼 응답 시간이 느려지기 때문에 적절한 숫자를 선정해야 한다. 기본값은 10이다.
val passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt(10))
입력한 비밀번호가 원래 비밀번호(암호화된)와 같은지를 확인하는 코드
// 생성된 해쉬를 원래 비밀번호로 검증한다. 맞을 경우 true를 반환한다.
// 주로 회원 로그인 로직에서 사용된다.
val isValidPassword = BCrypt.checkpw(password, passwordHashed)
참고한 포스팅
- Total
- Today
- Yesterday
- 안드로이드 키해시
- 카카오톡으로 로그인 오류
- 투포인터 알고리즘
- 코틀린 리스트뷰
- 코틀린 뷰바인딩
- 소수 구하기 파이썬
- 백준알고리즘
- 투포인터 알고리즘 파이썬
- 백준 1644
- 카카오 키해시
- 안드로이드
- 시뮬레이터 키보드
- 코틀린 뷰페이저
- 코틀린
- 전화번호목록 파이썬
- 프로그래머스
- 코틀린 바텀네비게이션
- flutter simultor
- 백준 2003
- Kotlin
- 안드로이드 카카오톡으로 로그인
- 백준
- 코틀린 데이터바인딩
- counting sort
- kotlin fragment
- 백준 1806
- 파이썬 최대공약수
- 데이터바인딩 뷰바인딩 차이
- 카카오 기출
- TextFormField keyboard
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |