2009-07-03 4 views
1

방금 ​​웹 사이트에서 사용자 로그인을위한 "기억하기"기능을 구현했습니다. 대부분의 충고는 쿠키에 사용자 ID를 저장 한 다음 오랫동안 추측 할 수없는 임의의 키를 갖는 것입니다. 이 두 가지가 일치하면 사용자는 인증 된 것으로 간주됩니다.보안 키가 두 개 이상입니까?

실제로 두 개의 문자열을 사용하면 도움이됩니까? 더 긴 열쇠가 똑같은 일을하지 않겠습니까?

즉, 하나의 긴 키로 공격에 동등하게 영향을받는 두 개의 키가 아닌가요? (나는 당신이 얼마나 많은 지에 관계없이 키의 전체 길이라고 상상한다.)

참고 : DB에서 큰 UUID를 찾는 것과 같은 몇 가지 DB 쿼리 효율성 문제가있을 수있다. 작은 숫자를 찾는 것만 큼 쉽지는 않습니다. Gmail은 사용자 이름과 함께 일회성 로그인 토큰으로 6 자리 숫자를 사용합니다.

답변

1

이것에 대한 강력한 논의는 SO thread입니다.

... 사용자가 인증 된 것으로 간주됩니다.

인증 된 것으로 읽어야하지만 권한이 제한되어 있어야합니다.

댓글 당 한 번 사용하기 때문에 다소 안전합니다. 추측하기 어렵습니다. 따라서 쿠키가 손상된 경우 공격자가 신속하게 조치를 취해야합니다. 그렇지 않으면 사용자 ID가 오랫동안 변경되지 않는 반면 로그인하는 합법적 인 사용자는 토큰을 무효화합니다.

+0

감사합니다. JP, 어제 내 다른 질문에 나왔다. 그 질문은 제가이 질문을하는 이유입니다. 대답이 아닙니다. 모두가 말하길, "userid 및 rememberme 토큰"은 ... 더 안전하거나 간단합니까? –

1

저는 전문가가 아니지만 무차별 대입 시도를 확인하는 한 짧은 키 (Gmail의 6 자리 숫자와 같이)를 사용할 수 있어야합니다. 진짜 취약점은 사용자가 로그인 할 때 듣는 사람들입니다 (예 : SideJacking).

+0

고마워, 그게 내가 생각하는거야. gmail과 같이 짧은 키를 사용하면 쿠키를 사용하여 로그인을 몇 번 시도한 후에 사용자를 종료해야 할 수 있습니다. 하지만 세션에서 실패한 시도를 사용하면 신뢰할 수 없으므로이를 수행 할 수 없습니다.이 문제는 다소 번거로운 작업입니다. –

1

이전에 만들었던 사이트에서 나는 user_id과 사용자 암호의 해시 된 해쉬를 사용했습니다. 두 필드를 사용하여 사용자를 인증 한 주된 이유는 다른 테이블을 추가해야하는 번거 로움을 줄여 데이터베이스 디자인을 복잡하게 만들었 기 때문입니다. user_id도 쿠키에 저장되어 있으므로 사용자가 색인 된 룩업을 할 수 있습니다 테이블에 저장하고 소금에 절인 해시를 사용자와 효율적으로 일치시킵니다. 물론 user_id와 해시를 하나의 값으로 연결하여 쿠키에 저장할 수 있습니다.

임의의 일치하지 않는 문자열이있는 경우 임의의 문자열을 사용자 ID와 연결하고 해당 특정 사용자에 대해 다른 조회를 수행하는 별도의 테이블이 있어야합니다.

+0

감사합니다. Patrick. 나는 그것에 대해 생각했지만 영구 세션을 무효화하는 쉬운 서버 측 방법이 없다 ... –

+0

@Daniel Rosenstark 쿠키 만료 시간은 적절하다고 느끼는 시간으로 설정할 수 있습니다. –

+0

고마워,하지만 클라이언트가 쿠키 만료 시간을 변경할 수 있습니다. 조작 할 수 없다면 신뢰할 수 없습니다. –

관련 문제