데이터베이스가 MySQL이면 MD5함수를 활용한다.
하지만 MD5와 SHA-1과 같은 단방향 해쉬 알고리즘은 해커의 공격으로부터 위험.
따라서 비크립트(bcrypt) 암호해시함수를 사용한다.
위키백과 설명
bcypt는 블로피시 암호에 기반을 둔 암호 해시 함수로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었다.[1] 레인보 테이블 공격 방지를 위해 솔트를 통합한 bcrypt는 적응형 함수의 하나이다. 시간이 지남에 따라 속도 저하를 위해 반복 횟수가 증가가 수반될 수 있으므로 연산 파워의 증가에도 브루트 포스 검색 공격에 대한 저항을 유지하게 된다.
bcrypt 함수는OpenBSD[2]및수세 리눅스등의 일부리눅스 배포판을 포함한 기타 시스템용 기본 암호해시 함수이다.[3]
C,C++,C#,Elixir,[4]Go,[5]Java,[6][7]자바스크립트,[8]펄,PHP,파이썬,[9]Ruby등의 언어용으로 bcrypt 구현체가 존재한다.
개요
bcrypt 해시 문자열은 다음의 형태에 속한다:
여기서
- 2a: 해시 알고리즘 식별자 (bcrypt)
- 10: Cost factor (210==> 1,024 rounds)
- N9qo8uLOickgx2ZMRZoMye: 16바이트(128비트) 솔트, base64-encoded to 22 characters
- IjZAgcfl7p92ldGxad68LJZdL17lhWy: 24바이트(192비트) 해시, base64-encoded to 31 characters
알고리즘
솔팅 : 비밀번호 암에 임의의 문자열을 추가(소금치기) 후 이를 해시함수에 넣어 다이제스트 생성
키 스트레칭 : 위 과정을 여러번 하는 것. 비밀번호를 입력받았을 때 n번 반복한 후 저장된 값과 같은지 비교하면 된다.
사용 방법
1. build.gradle에 dependencies 추가.
dependencies {
compile group: 'de.svenkubiak', name: 'jBCrypt', version: '0.4.1'
}
2. bcrypt 사용 예
// 사용자의 비밀번호
String password = "!@#$password1234";
// 위 비밀번호의 BCrypt 알고리즘 해쉬 생성
// passwordHashed 변수는 실제 데이터베이스에 저장될 60바이트의 문자열이 된다.
String passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt());
// 위 문장은 아래와 같다. 숫자가 높아질수록 해쉬를 생성하고 검증하는 시간은 느려진다.
// 즉, 보안이 우수해진다. 하지만 그만큼 응답 시간이 느려지기 때문에 적절한 숫자를 선정해야 한다. 기본값은 10이다.
String passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt(10));
// 생성된 해쉬를 원래 비밀번호로 검증한다. 맞을 경우 true를 반환한다.
// 주로 회원 로그인 로직에서 사용된다.
boolean isValidPassword = BCrypt.checkpw(password, passwordHashed);
그런데 비밀번호 찾기 했을 때 어떻게 알려줘?
는 임시비밀번호 발급해서 보내줘야함
양방향 해시함수가 아니라 단방향이기 때문에 복호화 못함
출처 : https://jsonobject.tistory.com/239
https://ko.wikipedia.org/wiki/Bcrypt
'공부 > 안드로이드' 카테고리의 다른 글
[안드로이드] 브로드캐스트 리시버(BroadcastReceiver) (0) | 2021.09.10 |
---|---|
[안드로이드] 서비스(Service) (0) | 2021.09.10 |
[안드로이드] 앱 제작 단계 (0) | 2021.08.11 |
[안드로이드] 프로젝트 루틴, 로드맵 (0) | 2021.08.11 |
[안드로이드] 나인패치 이미지 (0) | 2021.08.11 |