2013-08-31 2 views
10

현재 SSL을 통한 기본 인증을 사용하는 작은 웹 서버를 작성했습니다. 지금까지 모든 것이 훌륭하게 작동합니다. 이제 인증을 소화하도록 전환 (필요)하고 싶습니다. 그러나 데이터베이스에서 일반 텍스트로 저장되지 않은 암호로이 작업을 수행하는 방법을 알 수는 없습니까? 나는 저장된 사용자 암호의 암호 다이제스트 (bcrypt를 사용하여 생성) 만 가지고있다. http 다이제스트 인증이 가능합니까?데이터베이스 및 브라우저 다이제스트 인증의 암호화 된 암호

답변

11

그냥 지금보고있는 중이었습니다. 먼저, RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication을 통해 사양에 대한 통찰력을 얻고 REST API 인증에 어떻게 적용 할 수 있는지 살펴 봅니다.

질문과 대답이 일치해야합니다. 다이제스트 인증은 서버가 사용자의 비밀번호를 일반 텍스트로 저장해야한다는 의미입니까? - it should store the hash of (username|realm|password)제 서버는 일반 텍스트 암호를를 저장하지 않습니다

This 스택 오버플로 대답은 분명히 있습니다.

한 가지를 제외하면 괜찮 았을 것입니다. 표준 사양은 MD5를 해시 함수로만 지원합니다.

물론 당신은 모두 bcrypt 해시 MD5 해시를 저장하지만, 일을 너무만을 효율적으로 렌더링 bcrypt 해시의 보안을 저해 할 수 그것은 쓸모없는 (공격자는 MD5 해시를 강제 짐승에 자신의 노력을 이동할 수 있기 때문에 대신).


그래서, 난 다시 발을 내딛었 왜 스펙을 무시하고 해시 함수 (bcrypt(username|realm|password))로 모두면에 bcrypt 사용하지 생각?

의도적으로 천천히 말하면서, bcrypt has a maximum password lengthmakes it unsuitable for use as a general digest algorithm.


휴즈, 지금까지 내 머리가 수영하고 있었지만 나는 아직도 그것을 시도하고 있었다. 제안 중 일부는 SRP 또는 인증 된 암호화 (특히 EAX)와 함께 TLS를 사용하는 것이었지만, 단순한 웹 서비스를 위해 너무 먼 단계를 수행하고 있다고 생각했습니다.

간단히 말하면 실제로이 작업을 수행하는 데 어려움이 있다면 work around bcrypt's character limitation by using a preliminary hash 수 있습니다.

bcrypt(sha256(username|realm|password)) 

을 그리고 사양의 놨 버전에서 H(A1) 대신에 그것을 사용


긴 이야기는 짧게는 당신이 할 수있는 것 같습니다.

질문은 이제 복잡해 졌던 모든 것이 그만한 가치가 있습니까? HTTPS를 통한 기본 인증보다 추가 보안 계층을 얻었습니까?

+0

이벤트가 끝난 지 꽤 오래되었지만 환상적인 설명이 있습니다. 일반적으로 드라이브별로 '감사'의견을 말하지 않지만 이것이 다이제스트 인증의 한계를 이해하는 데 큰 도움이되었습니다. :) – ChrisV