2016-08-18 8 views
2

해시를 사용하여 이메일 주소 확인을위한 확인 토큰을 생성하려고합니다. 해쉬과 같이 생성된다 :해싱 대 데이터베이스 조회 효율성

email:username:salt 

해시는 SHA256 알고리즘으로 생성되고 동일한 염이 생성 된 각 토큰이 사용된다.

대체적으로보다 일반적으로 사용되는 방법은 데이터베이스에 저장된 일회용 UID를 생성하고 새 전자 메일 주소에 대한 확인 작업을 수행하는 것입니다.

제 질문은 이메일 유효성 검사를위한 토큰 생성을 효율적으로 처리하는 방법입니다 (프로세서 및 디스크 활용 등을 고려).

+1

각 사용자 계정마다 고유 한 임의 해시가 있어야한다고 생각합니다. 효율성은 매우 드문 사건이며 모든 경우에 자주 발생하지 않기 때문에 계정 생성과 관련하여 실제로 문제가되지 않습니다. –

답변

1

전자 메일 확인 토큰의 전체 목적은 보안 웹 서버에서 토큰을 생성하고 해당 토큰을 포함하는 링크를 클릭 할 수 있도록 해당 토큰을 다른 사람에게 전자 메일로 보냄으로써 해당 계정을 확인할 수 있도록하는 것입니다. 명심해야 할

중요한 것들 :

  • 토큰 재현 할 수있는 최종 사용자를위한 불가능합니다는, 그렇지 않은 경우는 위조 할 수있다.
  • 토큰은 클라이언트 서버가 암호화 토큰 (이상적)으로 서명해야 클라이언트가 올바른 토큰임을 알 수 있습니다. 또한 사용자가이 토큰을 서버로 보냈을 때 서버가 서버를 생성했는지 확인할 수 있기 때문에이 또한 중요합니다.
  • 토큰은 expireable 할 필요가 : 당신은 특정 시간 동안 사용하지 않을 경우이 토큰을 '만료'할 수 있어야한다 : 24 시간 삼일 등

이러한 이유로, 나는 당신이 취하는 접근법을 추천하지 않을 것이다.

대신 JSON web token을 사용합니다 (이상적인 사용 사례). 이 다른 SO question에는 알맞은 요약이 있습니다. 당신을 드릴 것입니다 JWT를 사용

:
  • 는 웹 서버에서 토큰을 생성합니다.
  • 지정한 만료일 이후에 사용할 수 없도록이 토큰에서 만료 날짜를 설정하십시오.
  • 원하는 토큰에 사용자 고유의 데이터를 인코딩합니다. 일반적으로 사용자 ID 또는 이와 유사한 것입니다. 사용자가 웹 서버에 다시 토큰을 전송

하는 JWT 것이다 : 악의적으로 다른

    토큰이 서버에 의해 생성 된 보증 것을
  • 이 아닌 사람.
  • 토큰이 (타임 스탬프와 관련하여) 여전히 유효 함을 보장합니다.
  • 토큰이 변경되지 않았 음을 보장합니다.
  • 이전에 인 코드 된 토큰 데이터 (사용자 ID/etc)를 봅니다.

나는이)

+0

JWT 접근법은 원래의 질문에서 제안한 해싱 접근법과 거의 비슷하지만 추가 타임 스탬프가 있거나 뭔가 빠졌는가? –

+0

서버 측 암호를 사용하여 토큰에 암호로 서명합니다. 이론적으로 추측 할 수있는 요소 만이 아니라 엔트로피에 여러 요소를 사용하기 때문에 수행하는 것보다 더 많은 보안을 확보 할 수 있습니다. – rdegges

+0

물론, 저는 위키피디아 기사에서 비밀 키로 언급 된 소금이 언급 한 시나리오에서 언급 한 시나리오에서 추측 할 가능성이 높다고 생각합니다. JWT를 사용하여 ID, 타임 스탬프 및 전자 메일 주소를 해싱하는 것 (및 서명으로 사용)과 비교하여 어떤 추가 요소가 사용되는지 설명해 주시겠습니까? –

1

= 도움이 당신이하고있는 것은 다소 안전 바랍니다.

나는 당신의 소금을 열쇠라고 부르겠다. 당신은 열쇠가있는 해시를 생성하고있다. 엔트로피가 충분한 키를 생성해야합니다. CSPRNG에 의해 생성 된 128 비트의 강도를 권장합니다.

이렇게 생성 된 일부 키 해시는 길이 확장 공격에 취약합니다. 즉, 공격자가 [email protected]의 유효성 검사 토큰을 생성 한 경우 [email protected]의 해시를 처리 할 수 ​​있습니다. 이것은 해시 알고리즘의 출력이 해당 상태를 배제하기 때문입니다. 이를 완화하려면 HMAC algorithm을 사용할 수 있습니다.

현재 접근 방식에는 이메일 주소가 항상 동일한 토큰을 사용한다는 제한이 있습니다. 전자 메일 주소가 만료되면 (예 : Organization Organization에서 전자 메일 [email protected]으로 해고당한 Bob Smith), 다음 Bob S가 예제 조직에서 일하기 시작할 때 얻을 인증 코드를 알게됩니다. 이것이 귀하의 신청에 대한 위험이되는지 여부는 귀하가 결정하는 것입니다. 이를 줄이기 위해 JWTs을 대신 사용할 수 있습니다. 이렇게하면 유효성을 검사 할 수있는 토큰에 만료 날짜를 넣을 수 있습니다. JWT의 HS256 알고리즘 또한 HMAC를 사용하여이 문제를 해결합니다.

키순 해시는 효율적이어야하며 데이터베이스 조회의 저장, 유지 관리 및 오버 헤드가 없습니다.

UID로 말하면 UUID입니까?

Remember that

는 :

A [UUID]의 목적은 전역 적으로 고유 한 것이어야한다 추측 할이어야한다.

[의 UUID]

고유성이 아닌 보안을 위해 설계된다.

엔트로피의 안전한 소스를 사용하여 즉석에서 128 비트 토큰을 생성하는 것이 좋습니다 (다른 CSPRNG). 공격자가 전자 메일 주소의 유효성을 검사 할 수 있음을 의미하는 데이터 유출 취약점을 방지하기 위해 SHA-256을 사용하여 서버 쪽에서이 항목을 해시 (소금없이)로 해시 할 수 있습니다.