2017-01-19 20 views
1

활성화 또는 비밀번호 재설정 토큰을 포함하는 링크를 만드는 가장 좋은 방법은 무엇입니까? URL은 이메일을 통해 전달되며 사용자는 계정을 활성화하거나 비밀번호를 재설정하기 위해 URL을 클릭해야합니다. 이에 스레드의 무리가 있지만 일관성있는 접근 방법이있을 나타나지 않고 각각의 접근 방식은 보안 및 개발 관점에서 모두 장점과 단점을 가지고 나타납니다활성화/비밀번호 재설정 링크를 구축하는 가장 좋은 방법

  1. 링크 매개 변수로 토큰을 포함 이 접근 방식의 쿼리 문자열

    http://www.example.com/activations/:[email protected] 
    

    에서 이메일 주소, 토큰은 데이터베이스에 해시하고 이메일은 사용자를 검색하는 데 사용됩니다. 토큰은 brycpt와 같은 라이브러리를 사용하여 데이터베이스의 해시 된 버전과 비교됩니다. 그것은 쿼리 문자열에 이메일 주소와 같은 민감한 데이터를 포함하는 것 같습니다, exposes some security risks.

  2. 링크는 매개 변수 또는 쿼리 문자열로 토큰을 포함합니다.

    http://www.example.com/activations/:token 
    

    이 이상적인 솔루션이 될 것처럼 보일 것입니다,하지만 난 데이터베이스에 저장된 토큰이 해시되지 않는 한 토큰을 비교하는 방법을 모르겠어요. 보안 관점에서 보면, 어떤 사람들은의 사람들이 token should be hashed이라고 주장하는 반면, 어떤 사람들은 token in the database doesn't need to be hashed이라고 주장했다. 데이터베이스에 해시 토큰을 보관한다고 가정 할 때 데이터베이스의 각 토큰을 반복하고 링크의 토큰과 비교하는 것은 많은 시간이 소요되는 것처럼 보입니다. 특히 많은 사용자가있는 앱의 경우 특히 그렇습니다. 그래서 아마도 이것에 대해서는 틀렸 겠지만이 방법을 사용하면 데이터베이스에 토큰을 저장하는 것이 필요합니다.

누구나 최선의 방법에 대한 생각이 있습니까?

답변

0

토큰 만 포함하는 방법 2 사용에 대한 인수가 없습니다.

토큰의 해시 만 데이터베이스에 저장해야한다는 것이 맞습니다 (SQL 주입). 당신이 볼 문제는, 사용 BCrypt에서 온다 :

  1. Bcrypt은 데이터베이스에있는 토큰을 검색 방지 소금가 포함되어 있습니다.
  2. BCrypt는 키 스트레칭을 적용하므로 확인이 매우 느려서 저장된 해시를 모두 확인할 수 없습니다.

약한 암호를 저장하기 위해 소금 및 키 스트레칭과 같은 두 가지 기법이 필수적이며, 이는 무차별 적 강제력을 실용적이지 않게 만듭니다. 우리의 토큰은 매우 강력한 "암호"(최소 20 자 0-9 a-z A-Z)이므로 이러한 기술이 필요하지 않으므로 토큰의 무제한 SHA-256을 데이터베이스에 저장할 수 있습니다. 이러한 해시는 SQL로 직접 검색 할 수 있습니다.

정말 안전하다는 것을 보여주기 위해 간단한 계산을 할 수 있습니다. 20 문자 토큰은 7E35 조합을 허용합니다. 3 Giga SHA-256 per second을 계산할 수 있다면, 우리는 여전히 약 3,700,000, 000,000, 000,000 년을 기대할 것입니다.

토큰이 암호화 된 임의의 소스에서 생성되었는지 확인하십시오.

+0

답장을 보내 주셔서 감사합니다.나는 해시에 bcrypt를 사용했기 때문에 소금을 사용하지 않고 해시 할 수 있다는 사실을 알지 못했습니다! –