문제

데이터베이스에 액세스할 수 있는 직원을 두지 않고 시스템에서 사용자 계정 관리를 처리하는 가장 좋은 방법은 무엇입니까?

예:

  1. 사용자 이름/비밀번호를 데이터베이스에 저장합니다.데이터베이스에 액세스할 수 있는 사람은 누구나 사용자 이름과 비밀번호를 볼 수 있으므로 이는 좋지 않은 생각입니다.따라서 그것을 사용하십시오.

  2. 사용자 이름/비밀번호 해시를 저장합니다.이것이 더 나은 방법이지만 데이터베이스의 비밀번호 해시를 인증 정보를 알고 있는 다른 계정의 해시로 바꾸면 계정에 액세스할 수 있습니다.그런 다음 액세스 권한이 부여된 후 데이터베이스로 다시 되돌립니다.

windows/*nix에서는 이를 어떻게 처리합니까?

도움이 되었습니까?

해결책

이는 수년 전 UNIX에서 흔히 발생했던 문제였으며 사용자 ID 구성 요소(사용자 이름, UID, 셸, 전체 이름 등)를 인증 구성 요소(비밀번호 해시, 비밀번호 해시 솔트)에서 분리하여 해결되었습니다.ID 구성 요소는 전역적으로 읽을 수 있지만(UID가 사용자 이름에 매핑되는 경우 실제로 읽기 가능해야 함) 인증 구성 요소는 ~ 해야 하다 사용자가 접근할 수 없도록 유지됩니다.사용자를 인증하려면 사용자 이름과 비밀번호를 허용하고 "인증됨" 또는 "인증되지 않음"이라는 간단한 결과를 반환하는 신뢰할 수 있는 시스템을 갖추어야 합니다.이 시스템은 인증 데이터베이스에 액세스할 수 있는 유일한 애플리케이션이어야 하며 타이밍 공격을 방지하기 위해 응답하기 전에 임의의 시간(아마도 0.1~3초) 동안 기다려야 합니다.

다른 팁

이것이 더 나은 방법이지만 데이터베이스의 비밀번호 해시를 인증 정보를 알고 있는 다른 계정의 해시로 바꾸면 계정에 액세스할 수 있습니다.

이 문제를 해결할 방법이 없습니다.비밀번호 파일에 대한 쓰기 액세스 권한을 가진 사람은 누구나 컴퓨터를 완전히 제어할 수 있습니다.

나는 2로 갈 것이지만 약간의 소금을 사용하십시오.일부 의사코드:

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

라이브러리에 구현된 잘 알려진 해시 함수(예: MD5 또는 SHA-1)를 사용하는 것이 중요합니다. 직접 만들거나 책에서 구현하려고 시도하지 마세요. 잘못될 위험을 감수할 가치가 없습니다.

@브라이언 R.본디:솔트를 사용하는 이유는 사전 공격을 더 어렵게 만들기 위한 것입니다. 공격자는 사전을 해시하고 모든 비밀번호에 대해 시도할 수 없으며 대신 솔트 + 사전을 가져와 해시해야 하므로 스토리지 요구 사항이 폭증합니다.가장 많은 1000개의 commaon 비밀번호 사전이 있고 이를 해시하는 경우 16kB 정도가 필요하지만 두 개의 임의 문자를 추가하면 62*62*16kB ≒ 62Mb가 됩니다.

그렇지 않으면 어떤 종류의 것을 사용할 수 있습니다 일회용 비밀번호 OTPW에 대해 좋은 소식을 들었지만 사용해본 적이 없습니다.

Jeff Atwood는 해싱에 관한 좋은 게시물을 가지고 있습니다. 해당 경로를 선택하기로 결정한 경우:

openID를 사용하면 기밀 사용자 비밀번호를 전혀 저장할 수 없습니다.누가 웹사이트 전용이라고 말했습니까?

  1. 정말 나쁜 생각입니다.데이터베이스가 손상되면 모든 계정이 손상됩니다.
  2. 좋은 방법입니다.해시 알고리즘에 사용자 이름이 포함되어 있으면 비밀번호 해시를 다른 해시로 바꾸는 것이 작동하지 않습니다.

Unix는 권한이 있는 사용자만 액세스할 수 있는 텍스트 파일 /etc/shadow에 해시를 저장합니다.비밀번호는 솔트로 암호화됩니다.

당신은 저장할 수 있습니다 소금 다른 테이블에 있는 해시된 비밀번호의 경우 물론 각 사용자는 자신만의 솔트를 갖게 됩니다.그런 다음 해당 테이블에 대한 액세스를 제한할 수 있습니다.

일반적인 접근 방식은 이메일에 옵션 2를 사용하는 것입니다.

사용자 이름, 비밀번호 해시 및 이메일 주소를 데이터베이스에 저장합니다.

사용자는 비밀번호를 입력하거나 재설정할 수 있습니다. 후자의 경우 무작위 비밀번호가 생성되고 사용자를 위한 새 해시가 생성되며 비밀번호는 이메일을 통해 해당 사용자에게 전송됩니다.

편집하다:데이터베이스가 손상되면 합리적인 정보에 액세스할 수 없다는 것만 보장할 수 있으며 더 이상 애플리케이션의 보안을 보장할 수 없습니다.

사용자 이름과 비밀번호를 해시하세요. 함께.이렇게 하면 두 명의 사용자가 동일한 비밀번호를 사용하더라도 해시는 여전히 달라집니다.

데이터베이스에 대한 액세스 권한을 얻는 것이 아마도 모든 공격자의 가장 일반적인 목표이기 때문에 이는 많은 응용 프로그램에서 약간 문제가 되지 않습니다.그렇다면 이미 데이터베이스에 대한 액세스 권한이 있는 경우에도 여전히 애플리케이션에 로그인하려는 이유는 무엇일까요?:)

'시스템'이 공개 웹사이트인 경우 RPX OpenId, Facebook, Google 등과 같은 가장 일반적인 제공업체에 대한 로그인/사용자 계정 서비스를 제공할 수 있습니다.

이제 질문을 공식화하는 방식을 고려할 때 귀하가 말하는 '시스템'은 내부 Windows/Linux 기반 엔터프라이즈 앱일 가능성이 더 높습니다.그럼에도 불구하고;로그인/사용자 계정 공급자에 대해 검색하는 사람들(RPX를 발견하기 전에 했던 것처럼)에게 이것은 적합할 수 있습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top