불로구

안드로이드 - 안전하게 암호화 하기 본문

프로그래밍/안드로이드

안드로이드 - 안전하게 암호화 하기

맹이맹이 2021. 11. 1. 17:19
반응형

https://d2.naver.com/helloworld/318732

안드로이드에서 암호화를 하기위한 방법을 찾아보던 중 좋은 자료가 있어서 공부한 내용을 정리해볼까 한다.

 

단방향 해시 함수

단순 텍스트 , 단방향 해시 함수의 다이제스트(digest)

단방향 해시 함수는 연산을 통해 원본 메시지를 변환하고 함호회된 다이제스트를 생성한다.

Spring 프로젝트를 하면서 단방향을 많이 사용했는데, 복호화가 안되어 임시 비밀번호 기능을 만들었던 기억이 있었다. 

즉, 단방향 해시 함수는 원본 메시지를 알아야 암호화된 메시지를 구하며, 암호화된 메시지로는 원본 메시지를 구할 수 없다.

 

단방향 해시함수는 입력값 일부를 다르게 변경할 경우 avalanche효과를 통해 원본 패스워드를 추론하기 어렵게 만든다. 

 

그럼 단방향 해시 함수는 절대적으로 안전하지 않은가?

그렇지 않다.

1. 인식 가능성 

동일한 메시지가 언제나 동일한 다이제스트를 갖는다면, 공격자가 전처리된 다이제스트를 가능한 많이 확보하여 원본메시지를 찾아낼 수 있다. ( 레인보우 어택 )

 

2. 속도

속도가 매우 빠르므로 해커가 매우 빠른 속도로 임의의 문자열을 비교할 수 있다.

(MD5의 경우 1초당 56억)

 

보안법은 없는가? = 솔팅 (salting)

단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열이며, 원본 메시지에 추가하여 다이제스트를 생성하는 것

 

jdfaf4io12onfd    +  myPassword  ->  ( Hash Func ) -> Digest

   (salt)

 

DB에서 사용할 경우 솔트와 다이제스트를 DB에 저장하고, 로그인 요청시 입력한 패스워드를 해시하여 일치 여부를 확인 가능

 

안드로이드에서 사용은?

val bCryptPassword = BCrypt.hashpw("myPassword", BCrypt.gensalt(10))
val validPassword = BCrypt.checkpw("myPassword", bCryptPassword)

bCryptPassword를 통해 DB에 저장될 60Byte 문자열을 생성

gensalt의 default값은 10이며, 숫자가 늘어날수록 해쉬를 생성하고 검증하는 시간이 느려진다.

즉, 시간이 느려지는만큼 보안성은 높아진다.

 

validPassword를 통해 생성된 해쉬를 원래 비밀번호로 검증한다.

반응형
Comments