Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

bcrypt

bcrypt는 Blowfish를 기반으로 만들어진 "단방향 암호화 해싱함수"로 1999년 USENIX에서 발표됐다. Rainbow table 공격을 막기 위해서 salt를 사용하며, 암호검사 요청이 반복될 수록 cost를 늘림으로써, 무차별 대입 공격(brute-force search)을 막을 수 있다. cost는 반복횟수로 2^n 이다.

 count

bcrypt 함수는 OpenBSD와 SUSE 리눅스를 비롯한 몇몇 리눅스 배포판에서 암호화 해시 알고리즘으로 사용하고 있다. 리눅스의 /etc/shadow 파일을 열어보면 "$2a$"나 "$2b$"로 시작하는 패스워드 해시가 있는데, 이들이 bcrypt 방식의 암호화 해시다.

 bcrypt

  • $ : bcrypt의 오리지날 버전은 $2a$ : bcrypt의 오리지날 버전은 $2$다. 오리지날 버전은 non-ASCII 문자나 널 문자를 처리하는 방법을 정의하지 않았다. $2a$는 널 문자를 포함하며, UTF-8로 인코딩 할 것을 정의한 버전이다. . 오리지날 버전은 non-ASCII 문자나 널 문자를 처리하는 방법을 정의하지 않았다. 널 문자를 포함하며, UTF-8로 인코딩 할 것을 정의한 버전이다.
  • 10$ : Cost의 크기는 2^10이다. Iteration count를 1024만큼 돌리겠다는 얘기다.
  • N9qo8uLOickgx2ZMRZoMye : 랜덤하게 만든 salt
  • ljZAgcFl7p92ldGxad68LJZdL17lhWy : 패스워드. Salt와 패스워드를 묶어서 해시해버렸기 때문에, 유추가 불가능하다.

테스트 코드

package main
    
import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)   

var password = []byte("mypassword-123")

func main() {
    // password로 부터, 암호화 해시를 만든다.
    // cost는 DefaultCost(10)
    en, _ := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
    fmt.Println(string(en))

    // 패스워드를 비교한다.
    // 성공할 것이다.
    err := bcrypt.CompareHashAndPassword(en, []byte("mypassword-123"))
    if err != nil {
        fmt.Println("Error", err.Error())
    } else {
        fmt.Println("Success")
    }
    
    // 패스워드를 비교한다.
    // 실패할 것이다.
    err = bcrypt.CompareHashAndPassword(en, []byte("mypassword-234"))
    if err != nil {
        fmt.Println("Error", err.Error())
    } else {
        fmt.Println("Success")
    }
}   

	
		

참고