비싼 인터넷 요금을 버리고 이웃의 안전하지 않은 Wi-Fi를 사용하고 싶습니까? Honeybadger 단일 요소 인증 흐름을 방해하는 유일한 이유가 있습니까? 자, 소식이 있습니다.
발표:2단계 인증(2FA)
농담은 제쳐두고, 우리는 보안을 매우 중요하게 생각합니다. 사용자와 데이터를 보다 안전하게 보호하는 데 도움이 되는 중요한 도구를 제공할 수 있게 되어 기쁩니다.
2FA를 활성화하는 방법을 설명할 수 있을 것 같지만 그게 무슨 재미가 있습니까? 암호화의 거친 세계를 가볍게 들여다보고 2FA가 작동하는 방식을 알아내는 것은 어떻습니까?
재미가 마음에 들지 않으면 완전히 바로 활성화하는 방법으로 이동할 수 있습니다. 내 감정은 상하지 않을 것입니다.
⚠️ 경고:아래의 일부 이론
많은 2FA 구현은 시간 기반 일회용 비밀번호라는 알고리즘을 기반으로 합니다. (TOTP ). 혀에서 굴러떨어집니다.
일회성?
예, 이 방법의 장점은 로그인할 때마다 동일한 "비밀번호"를 전송하지 않는다는 것입니다. 인증자 응용 프로그램을 사용하면 일회성 "비밀번호"가 생성되고 짧은 기간(보통 30초) 동안 유효합니다. , 이는 malcolm-in-the-middle 공격의 효과를 크게 약화시킵니다.
약간 복잡한 부분이 있지만 전체 구현은 비교적 간단합니다.
비밀
키 TOTP에 대한 이해를 위한 포인트 서버 (검증자) 및 인증자 (증명자) 공유 비밀이 있어야 합니다. 이것이 진짜입니다. "password"이지만 한 번만 전송됩니다(그래서 이것도 한 번인 것 같습니다)!
시크릿을 사용하는 권장 방법은 QR 코드를 사용하는 것입니다. QR 코드를 스마트폰으로 스캔하면 비밀이 다음과 같은 표준 URI로 인코딩됩니다.
otpauth://totp/Honeybadger.io:[email protected]?secret=base32-secret-key
QR 코드를 제공하면 다음과 같은 몇 가지 이점이 있습니다(일반 텍스트 비밀을 노출하는 것과 반대).
- 32자 코드를 입력할 시간이 있는 사람은 누구인가요?
- 인증자 앱은 일회용 비밀번호에 대한 유용한 레이블을 제공할 수 있습니다(URI에서 이메일 및 발급자 참조). 이는 여러 서비스에서 2FA를 사용할 때 특히 유용합니다.
- 마침내 좋습니다. QR코드를 사용해야 하는 이유!
otpauth
에 대한 몇 가지 추가(대부분 무시됨) 매개변수가 있습니다. 여기에서 볼 수 있습니다.
MAC와 나
비밀이 🤝에 합의되면 (언젠가) 일회용 비밀번호를 제공하라는 메시지가 표시됩니다. 현실이 되는 곳 .
TOTP HMAC 기반 일회용 비밀번호라는 다른 알고리즘을 기반으로 합니다. (HOTP) , 자체가 해시 기반 메시지 인증 코드를 기반으로 함 (HMAC) . 모두 하나의 큰 암호화 양파입니다.
TOTP &HOTP 기본적으로 해시되는 메시지의 변형입니다. HMAC 마법이 일어나는 곳입니다. HMAC 해싱 알고리즘을 통해 일부 값을 실행한 결과인 다이제스트를 생성합니다. 일부 루비 코드로 작동하는 것을 봅시다:
OpenSSL::HMAC.digest("SHA1", "my-secret-key", "the-earth-is-flat")
=> "R\xABp\xCB\xEC\xFEJ\r#\x02\xC8\xAB\x96\xB68\v\xDA0\xD7z"
와, 저 바이너리 스트링을 보세요! 이것이 우리의 메시지 인증 코드입니다. (MAC) .
SHA1
을 선택했습니다. 우리의 해싱 함수로 (TOTP 구현과 마찬가지로) ). 선택할 수 있는 다른 많은 기능이 있으며 각각 고유한 보안 및 성능 영향이 있습니다. 해싱 알고리즘의 급진적인 점은 모든 입력 , 동일한 출력을 얻습니다. , 매번! 또한 매우 다양하고 독특한 미묘한 입력 변경의 출력(에헴, 해싱 기능에 따라 다르지만 여기서는 충돌에 대해 크게 걱정하지 않아도 됩니다.)
알겠습니다. 그래서 메시지 인증 코드라고 합니다. 수신된 메시지가 진짜임을 증명하는 데 사용할 수 있기 때문입니다. 당신과 내가 비밀(my-secret-key
), the-earth-is-flat
메시지를 보내드릴 수 있습니다. MAC와 함께 . 동일한 입력으로 정확히 동일한 다이제스트 기능을 실행하기만 하면 됩니다. MAC이 일치하면 메시지를 인증한 것입니다! 변조된 것이 아니며 나에게서만 얻을 수 있었던 것입니다!
😎
타임코드
이제 이것을 TOTP로 다시 가져오겠습니다. . 시간에 대해 이야기할 시간입니다. . TOTP와 함께 , the-earth-is-flat
와 같은 터무니없는 메시지를 소화하는 대신 , 대신 입력으로 시간 단계 수(문자열로 변환됨)를 사용합니다. 인증 앱을 열고 코드가 전환되는 것을 지켜보면 패턴을 발견할 수 있습니다. 맞습니다. "분과 30분에 스위치가 켜집니다."라고 말해 보세요. 아주 좋습니다.
이렇게 하면 메시지 계산이 조금 더 간단해집니다. 이 경우 30초의 내림 카운트를 사용합니다(시간 단계 ) 시간의 시작부터 (글쎄, 유닉스 시간). 그래서, 다시 루비에서:
Time.now.to_i / 30
=> 51772900
아하! 이것이 우리의 메시지입니다. .
따라서 Authenticator 앱에서 신뢰할 수 있는 다이제스트 기능을 사용하여 새로운 HMAC :
hmac = OpenSSL::HMAC.digest("SHA1", "avwe8aw71j2boib23jkbjk32", "51772900")
=> "H\x7F\xC1\xACL\xDA\xDB\xE7DQ\x91kE\x1C\xE3,c\nH\xA0"
get_otp_code(hmac)
=> "332204"
마지막 단계는 이 이진 문자열에서 숫자 코드를 가져오는 것입니다. 약간의 조작이 필요하므로 익명의 get_otp_code
뒤에 숨길 것입니다. 지금은 기능. 원하는 경우 HOTP 사양에서 작동 방식에 대해 읽을 수 있습니다.
코드를 서버에 제출하면 정확히 동일한 다이제스트 작업을 수행하고 코드를 비교합니다. 그들이 일치할 때, 당신은 안에 있습니다! 우리는 시간과 함께 일하기 때문에 대기 시간이 요인입니다. 지연 가능성을 고려한 전략이 있습니다. 원한다면 그것이 숙제가 될 것임을 이해하십시오.
이것이 시간 기반 일회용 비밀번호의 요지입니다. 일하다!! 🎉 이 정보를 사용하여 다음 만찬 파티에 활용하신 후 언제든지 감사 이메일을 보내주세요!
구현
이러한 작업이 어떻게 작동하는지 이해하는 것이 중요하다고 생각하지만 자신만의 무엇이든 롤링하는 것은 강력히 권장하지 않습니다. 암호화 관련. Ruby/Rails 생태계의 좋은 점 중 하나는 문제를 해결할 수 있는 보석(때로는 많이)을 찾을 수 있다는 것입니다.
Honeybadger에서 devise를 사용하고 two_factor_authentication이라는 훌륭한 devise 플러그인이 있습니다. 선택할 수 있는 몇 가지 2FA 구현이 있으므로 이를 선택한 몇 가지 이유는 다음과 같습니다.
- 간단한 설정(마이그레이션, 일부 구성 및 이니셜라이저 뿌림)
- 일회성 코드를 자체 페이지에 입력할 수 있습니다(유효한 사용자/비밀번호 이후)
- 허용되는 기본값이지만 재정의하기 쉽습니다.
- 사양에서 권장하는 최대 로그인 시도 횟수 확인 기능도 있습니다.
활성화 방법
설정은 간단합니다. 사용자 설정> 인증 페이지로 이동하여 "2단계 인증 설정"을 선택하고 지침에 따라 Authy 또는 Google Authenticator(또는 다른 모든 TOTP)를 사용하여 비밀을 동기화합니다. 앱).
그게 다야! 다음에 로그인할 때 인증자 코드를 입력하라는 메시지가 표시됩니다. 입력하고 완전히 안심하고 진행하십시오. 🧘
보안과 단순성? 더 나아질 수 있습니까?
마지막 한 가지:비밀번호 확인
약한 비밀번호를 지지하는 모든 분들을 위한 빠른 비밀번호가 있습니다. 또한 devise-pwned_password gem과 통합되었습니다. 이제부터는 비밀번호가 필요한 작업을 수행할 때 제안된 비밀번호가 알려진 데이터 유출 내에서 널리 퍼져 있지 않은지 확인합니다. 새 비밀번호를 추가하고 확인에 실패하면 허용하지 않습니다.
아직 그렇지 않다면 매우 비밀번호 관리자(1Password ahem) 사용을 권장합니다.
Pwned Password의 더 흥미로운 부분 중 하나는 타사 서비스의 데이터베이스를 확인하는 동안에도 암호가 안전하게 유지되는 방법입니다. k-Anonymity
이라고 합니다. 여기에서 이에 대한 개요를 볼 수 있습니다.
글쎄, 그것이 우리가 지금 가진 전부입니다. 다음 시간까지! 👋