ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android][Kotlin] BCrypt 암호화 알고리즘
    안드로이드 2021. 7. 16. 00:48
    728x90
    반응형

    개발자에게 요즘 시스템 개발에 있어 가장 중요하게 생각해야 할 것 중 하나가 보안이라고 한다. 시스템의 정보를 암호화하여 비인가자로 부터 데이터 유출을 방지하고 사용자에게 시스템 가용성을 유지시키는게 암호화 하는 이유이다. 먼저 암호화 알고리즘에 대해 알아보도록 하자.

     

    암호화 알고리즘이란?


    데이터의 무결성 및 기밀성 확보를 위해 정보를 쉽게 해독할 수 없는 형태로 변환하는 기법

     

    암호화 종류


    • 대칭 암호화 알고리즘 : 암호화 복호화에 같은 암호키를 사용하는 알고리즘.
      • ex) DES, SEED , AES, ARIA, IDEA, LFSR
    • 비대칭 암호화 알고리즘 : 사전에 개인 키를 나눠 가지지 않은 사용자들이 안전하게 통신하는 알고리즘.
      • ex) 디피-헬만, RSA , ECC,ElGamal 
    • 해시 암호화 알고리즘 : 임의 길이의 정보를 입력받아, 해시함수를 통해 고정된 길이의 암호문을 출력하는 알고리즘. 복호화를 할 수 없다.
      • ex) MD5, SHA-1, SHA-256, HAS-160

     

    BCrypt


    BCrypt는 해시함수를 이용한 해시 암호화 알고리즘 중 하나이다. 하지만 일반적인 해시 암호화 알고리즘과는 다르다.

    일반적인 해시 암호화 알고리즘은 동일한 메시지가 언제나 동일한 다이제스트를 갖기 때문에, bruto force 방법으로 모든 문자열을 암호화한 후 비교해보면 바로 기존 비밀번호가 뭔지 알게 된다. 또한, 짧은 시간대에 데이터를 검색하기 위해 설계된 해시 함수를 사용하기 때문에 처리 속도가 아주 빠르다. 이는 유저 뿐만 아니라 해커에게도 좋은 점인데 비밀번호를 알아낼 때, 한번의 시도에 걸리는 시간이 적으니 많은 시도를 해볼 수 있다.

     

    Bcrypt는 위의 문제점을 해결하기 위한 방법으로 Saltingkey stretching을 사용한다.

     

    Salting이란 유저의 비밀번호 앞에 임의 문자열을 추가한 후, 이를 통째로 해시 함수에 넣어 다이제스트를 생성하는 방법이다.

    key stretching이란 생성된 다이제스트를 입력값으로 또 다이제스트를 생성하고, 이를 입력값으로 또 다이제스트를 생성하는 방법이다.

     

    반응형

    Bcrypt 사용 방법


    1. Build.Gradle(:app)에 BCrypt 라이브러리를 추가 해준다.

    implementation group: 'de.svenkubiak', name: 'jBCrypt', version: '0.4.1'

     

    2. BCrypt 알고리즘이 일정 길이의 평문을 암호화하는 방법은 두가지이다.

    //첫번째 방법
    val passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt())
    //두번째 방법
    val passwordHashed = BCrypt.hashpw(password, BCrypt.gensalt(20))

     

     

    위의 암호화 방식을 통해 변수 passwordHashed에는 60바이트의 문자열이 저장된다.

    첫번째와 두번째 방법의 차이점은 두번째 인자인 BCtypt.gensalt()의 인자인데, 인자가 높아질수록 해시를 생성하고 검증하는 시간이 느려지므로 보안이 더욱 우수해진다. 첫번째 값은 default 값인 10으로 암호화를 하는 방식이고, 두번째는 보안 강도를 높여서 암호화를 하는 방식이다.

     

    3. 입력한 데이터가 암호화된 데이터와 같은지 확인하는 방법

    val isValidPassword = BCrypt.checkpw(password, passwordHashed)

    입력한 데이터와 암호화된 데이터가 같다면 true를 반환, 다르다면 false를 반환하는 함수이다. 

     

    해시암호화는 복호화가 불가능한데 어떻게 같은지 확인하나요?

    Bcrypt는 입력한 데이터로 salt 값을 조회해 요청한 데이터에 해당 salt 값을 더해 암호화 한 후 비교합니다.

    해외 wikipedia 해석한 거라 부정확할 수 있습니다..!

     

    틀린 부분이나 개선할 점은 언제나 댓글로 피드백 해주시면 감사하겠습니다!

     

     

    참고
    https://en.wikipedia.org/wiki/Bcrypt
    https://yuuj.tistory.com/57
    728x90
    반응형

    댓글

Designed by ZibroTistory.