사용자 패스워드를 전송/보관하는 방법은?

사용자 비밀번호를 전송하고 보관하는 가장 일반적이고 안전한 방법 중 하나는 해싱이라는 프로세스를 사용하는 것


전체과정 개요

해싱은 일반 텍스트 비밀번호를 해커가 리버스 엔지니어링하기 어려운 읽을 수 없는 형식으로 변환하는 프로세스입니다. 해싱은 bcrypt 또는 SHA-256과 같은 다양한 해싱 알고리즘을 사용하여 수행할 수 있습니다. 사용자가 비밀번호를 입력하면 해싱된 후 데이터베이스에 저장됩니다. 사용자가 로그인하면 입력한 비밀번호가 해시된 다음 데이터베이스에 저장된 해시된 비밀번호와 비교됩니다. 일치하면 사용자가 인증되고 액세스가 허용됩니다. 해싱만으로는 충분하지 않으며, 무차별 암호 대입 공격에 대한 추가 보호를 위해 솔트를 사용해야 한다는 점에 유의해야 합니다.

조금더 자세히

  1. 암호화된 통신을 위해 SSL/TLS를 사용합니다: 전송 중 비밀번호를 보호하려면 개발자는 SSL/TLS를 사용하여 클라이언트와 서버 간에 데이터를 암호화해야 합니다. 이렇게 하면 공격자가 비밀번호 및 기타 민감한 정보를 가로채는 것을 방지할 수 있습니다.

  2. 강력한 해싱 알고리즘을 사용하여 비밀번호를 해시합니다: 개발자는 사용자 비밀번호를 저장할 때 일반 텍스트로 저장해서는 안 됩니다. 대신 bcrypt 또는 scrypt와 같은 강력한 해싱 알고리즘을 사용하여 비밀번호의 단방향 해시를 생성해야 합니다. 이렇게 하면 공격자가 비밀번호 데이터베이스에 액세스하더라도 실제 비밀번호를 검색할 수 없습니다. a. bcrypt와 SHA-256의 주요 차이점은 보안 수준과 속도입니다. Bcrypt는 더 안전한 것으로 간주되며 속도가 느리게 설계되어 공격자가 무차별 암호 대입 공격을 수행하기가 더 어렵습니다. 반면 SHA-256은 bcrypt보다 빠르지만 보안성은 떨어집니다. 또한, bcrypt는 각 비밀번호에 대해 자동으로 솔트를 생성하는 반면, SHA-256은 명시적인 솔트 값이 필요합니다. b. Bcrypt는 단순함으로 유명하며 1990년대 후반부터 사용되어 왔습니다. 계산 비용이 많이 들도록 설계되어 무차별 암호 대입 공격을 훨씬 더 어렵게 만듭니다. Bcrypt는 각 비밀번호에 대해 솔트를 생성하고 계산 복잡도를 조정하는 기능이 내장되어 있어 다양한 시스템에 맞게 사용자 정의할 수 있습니다. Bcrypt는 널리 사용되며 보안에 대한 입증된 실적을 보유하고 있습니다. c. 반면 Scrypt는 더 새로운 알고리즘으로, bcrypt보다 메모리를 더 많이 사용하도록 특별히 설계되었습니다. 따라서 GPU나 ASIC과 같은 특수 하드웨어를 사용하는 공격에 더 강합니다. 또한 Scrypt는 각 비밀번호에 대해 솔트를 생성하고 계산 복잡도를 조정하는 기능이 내장되어 있습니다. d. 현재 사용 가능한 최신 해시 알고리즘은 Argon2, SHA-3, BLAKE3 등 여러 가지가 있습니다. 이러한 알고리즘은 bcrypt 또는 Scrypt보다 훨씬 더 안전하고 계산 비용이 많이 들도록 설계되었습니다. Argon2는 현재 가장 안전한 알고리즘으로 간주되며 비밀번호 해싱 대회에서 우승한 알고리즘입니다. 부채널 공격에 강하도록 설계되었으며 사용자 정의가 가능합니다. SHA-256보다 더 빠르고 안전한 SHA-3와 BLAKE3는 점점 더 널리 채택되고 있습니다. 해싱 알고리즘의 보안은 알고리즘 자체에 의해서만 결정되는 것이 아니라 특정 시스템 내에서 해싱 함수의 구현과 구성에 의해서도 결정된다는 점에 유의해야 합니다.

  3. 레인보우 테이블 공격을 방지하기 위해 솔트를 사용합니다: 비밀번호 보안을 더욱 강화하려면 개발자는 각 사용자마다 고유한 솔트를 사용해야 합니다. 솔트는 해싱하기 전에 비밀번호에 임의의 값을 추가하는 것으로, 공격자가 미리 계산된 테이블(레인보우 테이블이라고 함)을 사용하여 비밀번호를 해독하는 것을 어렵게 만듭니다. a. 무차별 암호 대입 공격은 공격자가 올바른 비밀번호를 찾을 때까지 가능한 모든 조합을 시도하여 비밀번호를 해독하는 사이버 공격의 한 유형입니다. 이는 자동으로 비밀번호를 생성하고 올바른 비밀번호를 찾을 때까지 시도하는 소프트웨어를 사용하여 수행할 수 있습니다. 솔트를 사용하면 공격자가 올바른 비밀번호를 생성하는 데 더 어렵고 시간이 많이 걸리므로 무차별 암호 대입 공격으로부터 보호할 수 있습니다. 솔트는 해싱하기 전에 비밀번호에 추가되는 임의의 문자열로, 공격자가 가능한 모든 비밀번호의 해시값을 미리 계산하기 어렵게 만듭니다. 솔트를 사용하면 공격자가 비밀번호와 솔트의 모든 조합에 대해 해시를 생성해야 하므로 공격에 계산 비용과 시간이 많이 소요됩니다. 따라서 솔트를 사용하면 공격자가 비밀번호를 성공적으로 크래킹하기가 훨씬 더 어려워집니다.

  4. 해시된 비밀번호를 안전하게 저장하세요: 해시된 비밀번호를 저장할 때 개발자는 보안 데이터베이스 또는 유휴 상태의 암호화가 적용된 키-값 저장소와 같은 안전한 저장 메커니즘을 사용해야 합니다. 또한 비밀번호 데이터베이스에 대한 액세스는 권한이 있는 직원으로만 제한해야 합니다.

  5. 비밀번호 정책을 구현하세요: 개발자는 최소 길이 및 복잡성 요건과 같은 비밀번호 정책을 구현하여 사용자가 추측하기 어려운 강력한 비밀번호를 만들 수 있도록 해야 합니다.

  6. 다단계 인증 사용: 개발자는 강력한 비밀번호와 더불어 다단계 인증(MFA)을 구현하여 사용자 계정을 더욱 안전하게 보호해야 합니다. MFA는 사용자가 비밀번호 외에 토큰이나 생체 인식 요소와 같은 두 번째 인증 수단을 제공하도록 요구합니다.