공부/안드로이드

[안드로이드] 비밀번호 암호화 후 DB에 저장하기

ghhong 2021. 9. 2. 10:37

데이터베이스가 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

알고리즘

 

솔팅 : 비밀번호 암에 임의의 문자열을 추가(소금치기) 후 이를 해시함수에 넣어 다이제스트 생성

출처: 네이버 D2 [안전한 패스워드 저장]

키 스트레칭 : 위 과정을 여러번 하는 것. 비밀번호를 입력받았을 때 n번 반복한 후 저장된 값과 같은지 비교하면 된다.

출처: 네이버 D2 [안전한 패스워드 저장]

 

 

사용 방법

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

 

Java, BCrypt 해쉬 알고리즘으로 비밀번호 암호화하기

개요 과거 전산실 근무 시절 인하우스 개발된 시스템을 유지보수하다가 놀란 것은 생각보다 많은 비율로 사용자의 비밀번호를 암호화하지 않은채 그대로 데이터베이스에 저장한다는 것이다.

jsonobject.tistory.com

https://ko.wikipedia.org/wiki/Bcrypt

 

bcrypt - 위키백과, 우리 모두의 백과사전

bcrypt 파일 암호화 유틸리티에 대해서는 블로피시 문서를 참고하십시오. bcypt는 블로피시 암호에 기반을 둔 암호 해시 함수로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었

ko.wikipedia.org

https://yuuj.tistory.com/57

 

[Android][Kotlin] 비밀번호 암호화 공부 (BCrypt), 코틀린 비밀번호 암호화

사용자의 비밀번호를 암호화하지 않고 스트링 그대로 저장하는것은 위험하다. 졸업프로젝트를 진행할때는 MD5 방법을 사용했었는데, 안전한 비밀번호 저장에 대해 알아보다가 단방향 암호화 방

yuuj.tistory.com