security - with - 패스워드 암호화 알고리즘




나중에 일반 텍스트 검색을 위해 사용자 암호 저장소에 윤리적으로 접근해야합니까? (18)

Michael Brooks는 CWE-257에 대해 오히려 보컬입니다. 어떤 방법을 사용하든 관리자 (관리자)는 여전히 비밀번호를 복구 할 수 있습니다. 그렇다면 이러한 옵션은 어떻습니까?

  1. 다른 사람의 공개 키 - 일부 외부 권한으로 암호를 암호화하십시오. 그렇게하면 개인적으로 재구성 할 수 없으며 사용자는 외부 권한으로 가서 암호를 복구하도록 요청해야합니다.
  2. 두 번째 암호문에서 생성 된 키를 사용하여 암호를 암호화하십시오. 이 암호화를 클라이언트 측에서 수행하고 절대로 서버로 전송하지 마십시오. 그런 다음 복구하려면 입력에서 키를 다시 생성하여 암호 해독 클라이언트 측에서 다시 수행하십시오. 시피,이 방법은 기본적으로 두 번째 암호를 사용하는 것이지만 항상 암호를 적어 두거나 이전 보안 질문 방식을 사용하도록 할 수 있습니다.

개인 회사에서 개인 키를 보유 할 사람을 지정할 수 있기 때문에 1.이 더 나은 선택이라고 생각합니다. 키가 생성되는지 확인하고 안전한 방법으로 지시 사항을 저장하십시오. 비밀번호의 특정 문자를 암호화하여 내부 제 3 자에게만 제공하도록 선택하여 보안을 추가 할 수도 있으므로 추측을 위해 암호를 해독해야합니다 그것. 이러한 문자를 사용자에게 제공하면 아마도 그 문자가 무엇인지 기억할 것입니다!

계속해서 웹 사이트와 웹 응용 프로그램을 더 많이 만들면서 사용자의 암호를 저장하도록 요청받습니다. 사용자가 잊어 버린 암호 링크를 전자 메일로 보내거나 전화 등) 내가이 연습에 대해 격렬하게 싸울 수있을 때 실제 비밀번호를 저장하지 않고 비밀번호 재설정 및 관리 지원을 가능하게하는 많은 '추가'프로그래밍을 수행합니다.

내가 싸울 수 없다면 (또는 이기지 못할 때) 적어도 암호를 어떤 방식 으로든 인코딩하여 데이터베이스에 일반 텍스트로 저장되지 않도록 할 수 있습니다. DB가 해킹 당하면 범인이 암호를 해독하는 데 많은 시간이 걸리지 않으므로 불편할 수 있습니다.

완벽한 세상에서 사람들은 암호를 자주 업데이트하고 여러 사이트에 복제하지 않습니다. 불행히도 나는 직장 / 가정 / 이메일 / 은행 암호가 동일한 사람들을 많이 알고 있으며 도움이 필요할 때 자유롭게 그것을 나에게주었습니다. 내 DB 보안 절차가 어떤 이유로 실패하면 재무 재건을 책임지는 사람이되고 싶지 않습니다.

도덕적으로나 윤리적으로 나는 어느 정도의 존경심을 가지고 대처하고 있다고하더라도, 어떤 사용자에게는 생계를 유지할 책임이 있다고 느낍니다. 나는 해싱 해시와 다른 인코딩 옵션에 대해 접근하고 주장 할 수있는 많은 방법이 있지만, 저장할 때 하나의 '우수 사례'가있을 것이라고 확신합니다. 거의 모든 경우에있어서 PHP와 MySQL을 사용하고 있습니다. 그렇다면 구체적인 처리 방법에 차이가 있습니다.

Bounty에 대한 추가 정보

나는 이것이 당신이하고 싶은 일이 아니라는 것을 알고 있으며, 그렇게하기를 거절하는 대부분의 경우에 최선이라는 것을 분명히하고 싶습니다. 그러나 나는이 접근법을 취할 때 얻을 수있는 최선의 조치를 모색 중이다.

아래의 메모에서 나는 노약자를 대상으로하는 웹 사이트가 정신적으로 어려움을 겪거나 매우 어려울 때 보안 암호 복구 루틴을 수행하도록 요청받을 때 사람들에게 혼란 스러울 수 있다고 지적했습니다. 이러한 경우 사용자가 시스템에 도움이되거나 이메일을 보내거나 직접 표시하는 등의 추가 지원이 필요할 수도 있습니다.

그러한 시스템에서 이러한 인구 통계의 감소율은 사용자가이 수준의 액세스 지원을받지 못하면 응용 프로그램을 혼란스럽게 할 수 있으므로 이러한 설정을 염두에두고 응답하십시오.

모두에게 감사 드려요

이것은 토론의 제비를 가진 재미있는 질문이고 나는 그것을 즐겼다. 마지막으로 암호 보안을 유지하는 대답을 선택 했으므로 (일반 텍스트 또는 복구 가능한 암호를 유지할 필요가 없음) 또한 내가 지정한 사용자 단점이 발견 된 주요 단점없이 시스템에 로그인 할 수 있습니다 정상적인 암호 복구.

항상 그렇듯이 여러 가지 이유에서 올바른 것으로 표시하고 싶은 약 5 가지 답변이 있지만 가장 적합한 것을 선택해야합니다. 나머지는 +1이 있습니다. 모두에게 감사드립니다!

또한 Stack 커뮤니티의 모든 사람들에게이 질문에 투표하고 / 또는 즐겨 찾기로 표시했습니다. 나는 칭찬으로 100 표를 득표하고이 토론이 내가 가진 동일한 관심사를 가진 다른 누군가를 도왔기를 바랍니다.


고려하지 않은 다른 옵션은 이메일을 통한 작업을 허용하는 것입니다. 약간 번거롭지만 시스템의 특정 부분을 (읽기 전용으로)보기 위해 사용자의 시스템 외부에있는 사용자를 필요로하는 클라이언트를 위해이 기능을 구현했습니다. 예 :

  1. 사용자가 등록되면 일반 웹 사이트처럼 전체 액세스 권한을 갖습니다. 등록은 이메일을 포함해야합니다.
  2. 데이터 나 조치가 필요하고 사용자가 자신의 비밀번호를 기억하지 못한다면, 일반 " 제출 "버튼 옆의 특별한 " 권한을 이메일로 보내기 "버튼을 클릭하여 조치를 수행 할 수 있습니다.
  3. 그런 다음 요청을 수행 할 것인지 묻는 하이퍼 링크가 포함 된 전자 메일에 요청이 전송됩니다. 이것은 암호 재설정 이메일 링크와 유사하지만 암호를 재설정하는 대신 일회성 작업을 수행합니다.
  4. 그런 다음 사용자는 "예"를 클릭하고 데이터가 표시되어야하는지 또는 조치가 수행되어야하는지, 데이터가 공개되는지 등을 확인합니다.

덧글에서 언급했듯이, 전자 메일이 손상된 경우에는 작동하지 않지만 암호를 재설정하지 않으려는 @joachim의 의견은 해결됩니다. 결국, 그들은 암호 재설정을 사용해야 할 것이지만, 더 편리한 시간에 또는 필요에 따라 관리자 나 친구의 도움을 받아 암호를 재설정 할 수 있습니다.

이 솔루션을 사용하는 것은 행동 요청을 제 3 자의 신뢰할 수있는 관리자에게 보내는 것입니다. 이것은 노인, 정신 장애가있는, 매우 어리거나 다른 혼란스러운 사용자의 경우에 가장 효과적입니다. 물론이 작업에는 이러한 사람들이 자신의 행동을 지원할 수있는 신뢰할 수있는 관리자가 필요합니다.


나는 같은 문제가있다. 그리고 같은 방식으로 저는 항상 누군가가 제 시스템을 해킹한다고 생각합니다. "if"의 문제가 아니라 "when"의 문제입니다.

따라서 신용 카드 또는 비밀번호와 같은 복구 가능한 기밀 정보를 저장해야하는 웹 사이트를 수행해야하는 경우,

  • 다음으로 암호화합니다 : openssl_encrypt (string $ data, string $ method, string $ password)
  • 데이터 arg :
    • 민감한 정보 (예 : 사용자 비밀번호)
    • 필요한 경우 직렬화하십시오. 예를 들어 정보가 여러 민감한 정보와 같은 데이터 배열 인 경우
  • password arg : 사용자 만 알 수있는 정보를 사용하십시오.
    • 사용자 번호판
    • 사회 보장 번호
    • 사용자 전화 번호
    • 사용자의 어머니 이름
    • 전자 메일 및 / 또는 등록시 SMS로 보낸 임의의 문자열
  • 메소드 arg :
    • "aes-256-cbc"와 같은 하나의 암호 방법을 선택하십시오.
  • "password"인수에 사용 된 정보를 데이터베이스 (또는 시스템의 어떤 위치) 에나 저장하지 마십시오.

이 데이터를 다시 얻으려면 "openssl_decrypt ()"함수를 사용하고 사용자에게 대답을 요청하십시오. 예 : "비밀번호를 받으려면 질문 : 전화 번호가 무엇입니까?"

PS 1 : 데이터베이스에 저장된 암호로 절대 사용하지 마십시오. 사용자 핸드폰 번호를 저장해야하는 경우이 정보를 사용하여 데이터를 인코딩하지 마십시오. 항상 알고있는 정보 만 사용하거나 상대가 아닌 사람에게는 알기 힘든 정보를 사용하십시오.

PS 2 : "클릭 한 번으로 구매"와 같은 신용 카드 정보의 경우 로그인 암호를 사용합니다. 이 암호는 데이터베이스 (sha1, md5 등)에 해시되었지만 로그인 할 때 세션이나 비 지속 (즉, 메모리에) 보안 쿠키에 일반 텍스트 암호를 저장합니다. 이 평범한 암호는 절대로 데이터베이스에 남아 있지 않으며 실제로 메모리에 남아 있고 섹션의 끝에서 파괴됩니다. 사용자가 "원 클릭 구매"버튼을 클릭하면 시스템은이 암호를 사용합니다. 사용자가 facebook, twitter 등의 서비스로 로그인 한 경우 구매시 비밀번호를 다시 묻는 메시지를 표시 한 다음 (예 : 완전히 "클릭"하지 않은 경우) 사용자가 로그인하는 데 사용한 서비스의 일부 데이터를 사용합니다 (facebook id와 같은).


나는 그 질문에 대한 의견에 따라 :
한 가지 중요한 점은 거의 모든 사람들이 매우 매끄럽게 생각해 왔습니다 ... 초기 반응은 @Michael Brooks와 매우 유사합니다. @stefanw와 같이, 여기에있는 문제는 요구 사항이 깨 졌음을 깨달을 때까지는 그렇습니다.
그러나 그때 그것은 심지어 사실이 아닐 수도 있습니다. 여기서 누락 된 점은 응용 프로그램 자산의 암묵적인 가치 입니다. 간단히 말해서, 가치가 낮은 시스템의 경우, 모든 프로세스가 관련되어있는 완전히 안전한 인증 메커니즘이 과도하게 사용되며 잘못된 보안 선택입니다.
분명히, 은행의 경우 "모범 사례"가 필수적이며 CWE-257을 윤리적으로 위반하는 방법은 없습니다. 그러나 가치가없는 가치가 낮은 시스템을 생각하는 것은 쉽습니다 (그러나 단순한 암호는 여전히 필요합니다).

진정한 보안 전문 지식은 누구나 온라인으로 읽을 수있는 "베스트 프랙티스"를 독단적으로 분출하는 것이 아니라 적절한 절충점을 찾는 것임을 기억하는 것이 중요합니다.

따라서 다른 해결책을 제안합니다.
시스템의 가치에 따라, 그리고 시스템이 "값 비싼"자산 (ID 자체 포함)없이 적절하게 가치가 낮고 적절한 프로세스를 불가능하게하는 (또는 충분히 어렵거나 비용이 많이 드는) 올바른 비즈니스 요구 사항이있는 경우에만, , 그리고 클라이언트는 모든주의 사항을 알고 있습니다 ...
그런 다음 특별한 후프없이 점프 할 수있는 가역 암호화를 허용하는 것이 적절할 수 있습니다.
나는 암호화를 전혀 신경 쓸 필요가 없다는 말을하지 않으려 고한다. 왜냐하면 구현이 매우 간단하기 때문이다 (무시할 수있는 키 관리조차도 고려해야한다). 그리고 그것을 구현하는 비용보다 많은 보호를 제공한다. 또한 이메일, 화면 표시 등 사용자에게 원래 비밀번호를 제공하는 방법을 살펴볼 가치가 있습니다.
여기에서 가정 한 것은 도난당한 암호의 가치가 (심지어 전체적으로) 매우 낮기 때문에 이러한 해결책 중 어느 것도 유효 할 수 있습니다.

생동감 넘치는 토론, 실제로는 활발한 토론, 다른 게시물 및 별도의 댓글 스레드에서, 몇 가지 설명을 추가하고 여기서 다른 곳에서 제기 된 몇 가지 좋은 점에 응답합니다.

시작하려면 사용자의 원래 비밀번호를 검색하도록 허용하는 것이 나쁜 습관이고 일반적으로 좋지 않은 아이디어라는 점은 모두에게 분명합니다. 그건 논쟁의 여지가 없다.
더 나아가서, 나는 많은 경우, 대부분의 상황을 강조 할 것이다. 그것은 정말로 잘못되어, 더럽고, 불쾌하고, 추악하다 .

그러나 문제의 요지 는 원칙을 중심으로 합니다. 이 상황을 방지하는 것이 필요하지 않을 수도 있고, 그렇다면 상황에 가장 적합한 방식으로 그렇게하는 방법 이 있습니다 .

@Thomas, @sfussenegger 및 기타 언급 된 몇 안되는 질문에 답할 수있는 유일한 적절한 방법은 주어진 (또는 가설적인) 상황에 대한 철저한 위험 분석 , 위험에 처한 상황, 보호해야 할 가치의 정도를 이해하는 것입니다. , 그리고 그 보호를 제공하기 위해 어떤 다른 완화책이 사용되는지를 설명합니다.
아니요, 전문 용어가 아니며, 실제 라이브 보안 전문가를위한 가장 기본적인 도구 중 하나입니다. 가장 좋은 방법은 포인트 (일반적으로 경험이 부족한 사람들과 해킹을위한 가이드 라인)입니다. 그런 다음 사려 깊은 위험 분석이 필요합니다.

저도 재밌 네요. 나는 항상 보안 광신자 중 한 명으로 여겼고, 어쨌든 소위 "보안 전문가"의 반대편에 있습니다 ... 사실, 진실입니다. 왜냐하면 저는 광신자이기 때문에, 실제 실제 보안 전문가 - 나는 그 모든 중요한 위험 분석을 하지 않고 "모범 사례"도그마 (또는 CWEs)를 분출하는 것을 믿지 않는다.
"실제 문제가 무엇인지 알지 못하고 도구 벨트에 모든 것을 신속하게 적용하는 보안 열광자를 조심하십시오. 더 많은 보안이 반드시 좋은 보안과 일치하지는 않습니다."
위험 분석, 진정한 보안 광신도는 위험, 잠재적 손실, 가능한 위협, 보완적인 완화 등을 기반으로보다 현명하고 가치 / 위험에 기반한 트레이드 오프를 지적 할 것입니다. 건전한 위험 분석을 가리킬 수없는 "보안 전문가" 위험 분석을 수행하는 방법을 이해하지 못해 도그마와 CWE를 분출하는 것을 선호하지만 보안 해킹은 그 전문 지식을 기반으로하지 않으며 그 전문 지식은 그들이 인쇄 한 화장지의 가치가 없습니다.

실제로 그것은 우리가 공항 보안이라는 어리 석을 얻는 방법입니다.

그러나이 상황에서 적절한 타협점을 말하기 전에 명백한 위험을 살펴 보겠습니다 (이 상황에 대한 모든 배경 정보가 없기 때문에 분명한 것입니다. 우리는 모두 가설을 세우고 있습니다. 상황이있을 수 있습니다 ...)
LOW-VALUE 시스템을 가정 해 봅시다. 공개 액세스 권한이없는 trival은 아닙니다. 시스템 소유자는 우연한 명의 도용을 방지하기를 원하지만 "높은"보안은 사용 용이성만큼 중요하지 않습니다. (그렇습니다. 능숙한 스크립트 키디가 사이트를 해킹 할 수있는 위험을 감수하는 것은 합당한 거래입니다 ... 잠깐, APT가 유행하니?)
예를 들어, 대규모 가족 모임을위한 간단한 사이트를 준비 중이라고 가정 해 봅시다. 올해는 모두가 캠핑 여행을 떠나기를 원할 것입니다. 나는 그녀가 필요로 할 때 로그온 할 수없는 에머모모모르과 같이 익명의 해커 또는 심지어 사촌 프레드가 Wantanamanabikiliki 호수로 돌아가는 반복 제안을 짜내는 것에 대해 덜 우려하고 있습니다. 자, 원자 물리학자인 에마 (Erma) 아줌마는 암호를 기억하거나 컴퓨터를 전혀 사용하지 않아서 ... 그래서 나는 그녀에게 가능한 모든 마찰을 제거하고 싶다. 다시 말하지만, 해킹에 대해 걱정할 필요가 없습니다. 잘못된 로그인 오류를 바보처럼 사용하지 마십시오. 누가오고 있는지, 원하는지 알고 싶습니다.

어쨌든.
단방향 해시를 사용하는 대신 암호를 대칭 암호화하는 경우 여기에서 주요 위험은 무엇입니까?

  • 사용자를 가장 했습니까? 아니요, 이미 위험을 받아 들였습니다. 흥미는 없습니다.
  • 사악한 관리자 요? 글쎄, 어쩌면 ...하지만 다시는 누군가가 내부 또는 다른 사용자로 가장 할 수 있는지 상관하지 않습니다. 어쨌든 악의적 인 관리자는 어쨌든 관리자의 상태가 좋지 않으면 암호를 가져올 것입니다.
  • 제기 된 또 다른 문제는 ID가 실제로 여러 시스템간에 공유된다는 것입니다. 아! 이것은 매우 흥미로운 위험이며, 더 자세히 살펴 봐야합니다.
    먼저 증명 이나 인증 자격 증명 과 공유되는 실제 ID 가 아니라고 주장하면서 시작하겠습니다. 좋아, 공유 암호가 효과적으로 다른 시스템 (예 : 은행 계좌 또는 Gmail)에 들어가게하므로 사실상 동일한 ID이므로 의미가 있습니다 ... 그렇지 않은 경우를 제외하고는. 신원은이 시나리오에서 각 시스템에 의해 개별적으로 관리됩니다 (OAuth와 같은 타사 ID 시스템 - 여전히 시스템에서 신원과 분리되어 있음 - 나중에 자세히 설명).
    따라서 여기 위험의 핵심은 사용자가 여러 다른 시스템에 자신의 (동일한) 비밀번호를 기꺼이 입력한다는 것입니다. 이제는 (관리자) 나 내 사이트의 다른 해커가 Erma의 암호에 대한 액세스 권한을 갖게됩니다. 핵 미사일 부지.

흠.

여기에 뭐가 보이지 않는가?

그것해야합니다.

핵 미사일 시스템을 보호하는 것이 나의 책임아니라는 사실부터 시작해 봅시다. 저는 (가족을 위해서) frakkin family outing site를 건설하고 있습니다. 그렇다면 누구의 책임입니까? 핵 미사일 시스템은 어떻습니까? 이봐.
둘째, 다른 사람의 암호 (보안 사이트간에 동일한 암호를 반복적으로 사용하는 것으로 알려진 사람)를 훔치려는 경우 - 왜 사이트를 해킹해야합니까? 또는 대칭 암호화에 어려움을 겪고 있습니까? Goshdarnitall, 나는 내 자신의 간단한 웹 사이트를 올려 놓을 수 있고 , 사용자들이 원하는 것을 무엇이든간에 매우 중요한 뉴스를 받기 위해 등록하게 할 수 있습니다 ... Puffo Presto, 나는 그들의 암호를 "훔쳤습니다".

그렇습니다. 사용자 교육은 항상 우리에게 hienie를 물려주기 위해 다시 돌아옵니다. 그렇죠?
그리고 그 일에 관해 할 수있는 일은 없습니다 ... 사이트에서 암호를 해시하고 TSA가 생각할 수있는 모든 작업을 수행해도 암호를 보호 할 수 있습니다. 무차별 적으로 자신의 암호가 부딪 치는 모든 사이트에 암호를 부착합니다. 그다지 노력하지 마십시오.

다른 말로하면, 당신은 자신의 암호를 소유하고 있지 않으므로 자신 이하는 것처럼 행동하려고하지 마십시오.

보안 전문가 인 웬디 (Wendy 's)에게 물어 봤던 노파가 "위험은 어디에 있습니까?"

위에 제기 된 몇 가지 문제에 대한 답변으로 몇 가지 다른 점이 있습니다.

  • CWE는 법이나 규정 또는 표준이 아닙니다. 그것은 공통된 약점 의 모음입니다. 즉, 모범 사례의 반대입니다.
  • 공유 된 정체성의 문제는 실제 문제이지만 여기에있는 다른 사람들에 의해 오해 (또는 허위 진술)됩니다. 값이 작은 시스템에서 암호를 해독하는 것이 아니라 자체적으로 ID를 공유하는 문제입니다 (!). 가치가 낮은 시스템과 가치가 높은 시스템간에 암호를 공유하는 경우 문제가 이미 있습니다.
  • by는 앞의 요점이 OAuth 등을 사용하여 이러한 저 가치 시스템과 고 가치 은행 시스템 모두를 반대 한다고 지적했습니다.
  • 나는 그것이 단지 예일 뿐이라는 것을 알고있다. 그러나 (슬프게도) FBI 시스템은 실제로 가장 안전하지 않다. 고양이의 블로그 서버와 닮은 것은 아니지만보다 안전한 은행을 능가하는 것은 아닙니다.
  • 실제로 PCI-DSS는 기본적으로 모든 판매자에게 이것을 요구합니다 . 따라서 더 이상 멀리 떨어져 있지 않습니다 (가치가 정당화되는 경우).
  • 이와 같은 질문에 불평하는 모든 사람들은 개발자 직업을 너무 나빠 보이게 만듭니다. 보안 전문가를 더욱 악화시키는 답변과 같습니다. 다시 말하면 비즈니스 중심의 위험 분석이 필요한 것이며, 그렇지 않으면 스스로를 쓸모 없게 만듭니다. 잘못되는 것 외에도.
  • 이것이 정규 개발자를 받아 들여 그에 대한 보안 책임을 더하고, 다르게 생각할 수있는 교육을하지 않고 올바른 교환을 찾는 것이 바람직하지 않은 이유입니다. 여기서 당신에게 불쾌감을주지는 않습니다. 그러나 나는 더 많은 훈련이 필요합니다.

아휴. 얼마나 긴 게시물 ...
그러나 원래의 질문에 답하기 위해 @Shane :

  • 고객에게 적절한 방법을 설명하십시오.
  • 그가 여전히 주장한다면, 좀 더 설명하고 주장하십시오. 필요한 경우 화를 낸다.
  • BUSINESS 위험에 대해 설명하십시오. 세부 사항은 좋고 수치는 더 좋으며 라이브 데모가 가장 좋습니다.
  • 그가 여전히 주장하고 유효한 사업상의 이유를 제시한다면 - 그것은 당신이 판단 전화를 할 때입니다.
    이 사이트는 가치가 낮습니까? 정말 유효한 비즈니스 사례입니까? 너에게 충분 해? 귀하가 고려할 수있는 다른 위험 요소가 없습니까? 이는 유효한 사업상의 이유보다 중요합니다. (물론 클라이언트는 악의적 인 사이트가 아니라 그저 그렇습니다).
    그렇다면 바로 앞으로 가십시오. 필요한 프로세스를 제자리에 놓기위한 노력, 마찰 및 사용량 상실 (이 가상의 상황에서)은 가치가 없습니다. 다른 결정 (다시,이 상황에서)은 나쁜 트레이드 오프입니다.

그래서 결론과 실제 답변 - 간단한 대칭 알고리즘으로 암호화하고, 강력한 ACL 및 바람직하게는 DPAPI 등으로 암호화 키를 보호하고, 문서화하고 클라이언트 (해당 결정을 내릴 수있는 선배)가 서명하도록합니다. 그것.


나중에 일반 텍스트 검색을 위해 암호를 윤리적으로 저장할 수 없습니다. 그것만큼이나 간단합니다. Jon Skeet조차도 나중에 일반 텍스트 검색을 위해 암호를 윤리적으로 저장할 수 없습니다. 사용자가 일반 텍스트로 암호를 검색 할 수있는 경우 해커가 코드에 보안 취약점을 발견 할 수 있습니다. 그리고 그것은 한 사용자의 암호가 유출 된 것이 아니라 모든 것이 손상된 것입니다.

고객에게 문제가있는 경우 비밀번호 저장이 법으로 금지되어 있다고 말하십시오. 영국의 어떤 경우에도 1998 년 데이터 보호법 (특히 Schedule 1, Part II, Paragraph 9)은 데이터 통제자가 적절한 기술 조치를 사용하여 개인 정보를 안전하게 유지하도록 요구합니다. 데이터가 유출 된 경우 발생할 수있는 위험 - 사이트간에 비밀번호를 공유하는 사용자에게는 상당한 영향을 미칠 수 있습니다. 문제가 있다는 사실을 아직 잘 모르는 경우, 실제 사례와 같이이 문제를 지적하십시오.

사용자가 로그인을 복구 할 수있게하는 가장 간단한 방법은 자동으로 로그인하는 일회성 링크를 전자 메일로 보내고 새 암호를 선택할 수있는 페이지로 직접 이동시키는 것입니다. 프로토 타입을 작성하고 실제 프로토 타입을 보여줍니다.

주제에 대해 쓴 블로그 게시물은 다음과 같습니다.

업데이트 : 우리는 이제 사용자의 암호를 제대로 보호하지 못한 회사에 대한 소송 및 기소를보기 시작했습니다. 예 : LinkedIn이 5 백만 달러의 집단 소송으로 기소되었습니다 . 소니는 플레이 스테이션 데이터 해킹에 250,000 파운드의 벌금을 부과했다 . 올바르게 기억하면 LinkedIn은 실제로 사용자의 암호를 암호화했지만 사용중인 암호화가 너무 약하여 효과적이지 못했습니다.


내가이 주제에 대해 조금은 이해하고 있지만, 사인온 / 암호가있는 웹 사이트를 구축하는 경우 서버에 일반 텍스트 암호가 전혀 표시되지 않아야한다고 생각합니다. 비밀 번호는 해시되어야하고 클라이언트가 떠나기 전에 소금에 절여 있어야합니다.

일반 텍스트 암호가 표시되지 않으면 검색 문제가 발생하지 않습니다.

또한 MD5와 같은 일부 알고리즘은 더 이상 안전한 것으로 간주되지 않는다고 (웹에서) 수집합니다. 나는 스스로 판단 할 방법이 없지만 고려해야 할 것입니다.


독립 실행 형 서버에서 DB를 열고이 기능이 필요한 각 웹 서버에 암호화 된 원격 연결을 제공하십시오.
그것은 관계형 DB가 아니어도되며 테이블과 행 대신 폴더와 파일을 사용하여 FTP 액세스가 가능한 파일 시스템이 될 수 있습니다.
가능한 경우 웹 서버에 쓰기 전용 권한을 부여하십시오.

일반인처럼 암호의 검색 할 수없는 암호화를 사이트 DB에 저장하십시오 ( "pass-a"라고합시다).
각각의 새 사용자 (또는 암호 변경)는 암호의 일반 사본을 원격 DB에 저장합니다. 서버의 id, 사용자의 ID 및 "pass-a"를이 암호의 복합 키로 사용하십시오. 심지어 암호를 양방향 암호화하여 야간에 더 잘 수 있습니다.

이제 누군가 암호와 컨텍스트 (사이트 ID + 사용자 ID + "pass-a")를 모두 얻으려면 다음을 수행해야합니다.

  1. 웹 사이트의 DB를 해킹하여 ( "pass-a", 사용자 ID) 쌍 또는 쌍을 얻습니다.
  2. 일부 설정 파일에서 웹 사이트의 ID 가져 오기
  3. 원격 암호 DB를 찾아서 해킹하십시오.

암호 검색 서비스의 액세스 가능성을 제어 할 수 있습니다 (보안 웹 서비스로만 노출, 하루 일정량의 암호 검색 만 허용, 수동으로 수행 등).이 "특별 보안 배치"에 대해서는 추가 요금을 지불 할 수도 있습니다.
패스워드 검색 DB 서버는 많은 기능을 제공하지 못하기 때문에 매우 숨겨져 있으며,보다 안전하게 보호받을 수 있습니다 (권한, 프로세스 및 서비스를 단단히 조정할 수 있습니다).

결국 해커가 더 열심히 일하게됩니다. 단일 서버에서 보안 침해의 가능성은 여전히 ​​동일하지만 의미있는 데이터 (계정 및 암호와 일치)는 수집하기가 어려울 수 있습니다.


등록시 평문 암호를 전자 메일로 보내서 암호화하고 분실하기 전에 어떻게해야합니까? 많은 웹 사이트에서이 작업을 수행했으며 사용자의 전자 메일에서이 암호를 얻는 것이 서버 / 컴퓨터에 저장하는 것보다 안전합니다.


분실 / 잊어 버린 비밀번호 처리 :

암호를 복구 할 수있는 사람이 없어야합니다.

사용자가 암호를 잊어 버린 경우 적어도 사용자 이름이나 전자 메일 주소를 알고 있어야합니다. 요청에 따라 Users 테이블에 GUID를 생성하고 GUID를 포함하는 링크가 포함 된 전자 메일을 매개 변수로 사용자의 전자 메일 주소에 보냈습니다.

링크 뒤의 페이지는 매개 변수 guid가 실제로 존재하는지 확인하고 (아마도 일부 타임 아웃 논리를 사용하여) 사용자에게 새 암호를 묻습니다.

핫라인 도움말 사용자가 필요한 경우 보조 기능 모델에 일부 역할을 추가하고 핫라인 역할이 식별 된 사용자로 임시 로그인하도록 허용하십시오. 모든 핫라인 로그인을 기록하십시오. 예를 들어, Bugzilla는 관리자에게 그러한 가장 기능을 제공합니다.


사용자가 원래 암호를 검색 할 수있게하는 유일한 방법 은 사용자 자신의 공개 키로 암호를 암호화하는 것입니다. 해당 사용자 만 암호를 해독 할 수 있습니다.

따라서 단계는 다음과 같습니다.

  1. 사용자는 아직 암호를 설정하지 않고 사이트에 등록합니다 (당연히 SSL을 통해). 자동으로 로그인하거나 임시 비밀번호를 제공하십시오.
  2. 향후 암호 검색을 위해 공개 PGP 키를 저장하도록 제안합니다.
  3. 공개 PGP 키를 업로드합니다.
  4. 새 암호를 설정하도록 요청합니다.
  5. 그들은 그들의 비밀 번호를 제출합니다.
  6. 사용할 수있는 최상의 암호 해싱 알고리즘 (예 : bcrypt)을 사용하여 암호를 해싱합니다. 다음 로그인을 확인할 때 사용하십시오.
  7. 공개 키로 암호를 암호화하고 별도로 저장합니다.

그런 다음 사용자가 자신의 암호를 묻는다면 암호화 된 (해시가 아닌) 암호로 응답합니다. 사용자가 나중에 암호를 검색 할 수 없으면 (서비스 생성 암호로만 재설정 할 수 있음) 3 단계와 7 단계를 건너 뛸 수 있습니다.


사용자의 보안 질문에 대한 대답을 암호화 키의 일부로 만들고 보안 질문 답변을 일반 텍스트 (대신 해시)로 저장하지 않습니다.


생존을위한 다중 요소 인증 시스템을 구현합니다. 따라서 재설정 / 레크리에이션 워크 플로우를 위해 사용자를 인증하기 위해 일시적으로 적은 요소를 사용하면서 암호를 재설정하거나 재구성 할 수 있다고 생각하는 것이 당연합니다. 특히 OTP (일회성 암호)를 추가 요소로 사용하면 제안 된 워크 플로의 시간 범위가 짧으면 많은 위험을 줄일 수 있습니다. 우리는 스마트 폰을위한 소프트웨어 OTP 생성기를 구현했으며 (대부분의 사용자는 이미 하루 종일 휴대하고 있습니다) 큰 성공을 거두었습니다. 상업용 플러그에 대한 불평이 나오기 전에 사용자를 인증하는 데 사용되는 유일한 요소가 아닌 경우 암호를 쉽게 검색하거나 재설정 할 수있는 위험을 낮출 수 있습니다. 나는 사이트 시나리오 중 암호 재사용을 위해 상황이 여전히 좋지 않다는 점을 인정한다. 왜냐하면 사용자는 다른 사이트도 열려고하기 때문에 원래 비밀번호가 있어야한다고 주장 할 것이지만 재구성 된 비밀번호를 가장 안전한 방법 (htpps 및 html로 신중한 모양).


이 부분을 읽은 후 :

아래의 메모에서 나는 노약자를 대상으로하는 웹 사이트가 정신적으로 어려움을 겪거나 매우 어려울 때 보안 암호 복구 루틴을 수행하도록 요청받을 때 사람들에게 혼란 스러울 수 있다고 지적했습니다. 이러한 경우 사용자가 시스템에 도움이되거나 이메일을 보내거나 직접 표시하는 등의 추가 지원이 필요할 수도 있습니다.

그러한 시스템에서 이러한 인구 통계의 감소율은 사용자가이 수준의 액세스 지원을받지 못하면 응용 프로그램을 혼란스럽게 할 수 있으므로 이러한 설정을 염두에두고 응답하십시오.

이러한 요구 사항들 중 어떤 것이 검색 가능한 암호 시스템을 요구하는지 궁금해졌습니다. 예를 들어, Mabel 이모가 전화를 걸어 "귀하의 인터넷 프로그램이 작동하지 않고 암호가 모름"이라고 말합니다. "OK"는 고객 서비스 무인 장치를 말합니다. "몇 가지 세부 정보를 확인한 다음 새 암호를 알려 드리겠습니다 . 다음에 로그인하면 암호 를 유지할지 또는 기억할 수있는 암호로 변경할지 묻는 메시지가 표시됩니다 더 쉽게."

그런 다음 시스템은 암호 재설정이 발생한시기를 알리고 "새 암호를 유지 하시겠습니까? 아니면 새 암호를 선택 하시겠습니까?"라는 메시지를 표시하도록 설정됩니다.

PC에 익숙하지 않은 사람들이 이전 암호를 사용하는 것보다이 점이 더 나쁜가요? 고객 서비스 담당자가 장난을하는 동안 데이터베이스 자체가 파손될 경우를 대비하여 훨씬 안전합니다.

내 제안에 나쁜 점을 언급하고 나는 실제로 당신이 원했던 것을 실제로하는 해결책을 제안 할 것입니다.


이 질문에 대한 응답으로 사용자에 대한 보안 문제에 대해 많은 논의가 있었지만 혜택에 대한 언급을 추가하고 싶습니다. 지금까지는 시스템에 복구 할 수있는 비밀번호를 저장하는 것에 대해 언급 된 합법적 인 혜택을 보지 못했습니다. 이걸 고려하세요:

  • 사용자가 자신의 비밀번호를 전자 메일로 보내는 데 도움이됩니까? 아니요. 일회용 비밀번호 재설정 링크를 사용하면 더 많은 혜택을 얻을 수 있습니다. 비밀번호 재설정 링크를 사용 하면 기억할 수있는 비밀번호를 선택할 수 있습니다.
  • 사용자가 암호를 화면에 표시하는 이점이 있습니까? 위와 같은 이유로 아니오. 새 암호를 선택해야합니다.
  • 지원 담당자가 사용자에게 암호를 말하도록함으로써 이익을 얻는가? 아니; 지원 담당자가 사용자의 패스워드 요청이 적절히 인증 된 것으로 간주하는 경우, 사용자에게 새로운 패스워드와 기회를 제공하는 것이 더 유익합니다. 또한 전화 지원은 자동화 된 암호 재설정보다 비용이 많이 들기 때문에 회사도 이익을 얻지 못합니다.

복구 가능한 암호의 혜택을 누릴 수있는 유일한 방법은 악의적 인 의도가 있거나 타사 암호 교환을 요구하는 API 가난한 사용자를 지원하는 것입니다 (해당 API를 사용하지 마십시오!). 어쩌면 회사는 고객에게 복구 할 수있는 암호를 저장함으로써 아무런 이득도 얻지 않고 부채만을 얻는다는 사실을 진실하게 말할 수 있습니다 .

이러한 유형의 요청 라인을 읽으면 클라이언트가 암호를 관리하는 방법을 이해하지 못하거나 실제로조차 신경 쓰지 않는 것을 알 수 있습니다. 그들이 정말로 원하는 것은 사용자가 그리 힘들지 않은 인증 시스템 입니다. 따라서 실제로 복구 할 수있는 비밀번호를 원하지 않는 방법을 알려주는 것 외에도 인증 프로세스를 덜 고통스럽게 만들 수있는 방법을 제공해야합니다. 특히 은행과 같이 높은 수준의 보안이 필요하지 않은 경우에는 더욱 그렇습니다.

  • 사용자가 사용자 이름에 대해 자신의 전자 메일 주소를 사용할 수 있도록 허용합니다. 사용자가 사용자 이름을 잊어 버렸지만 이메일 주소를 잊어 버리지 않은 수많은 사례를 봤습니다.
  • OpenID를 제공하고 제 3 자에게 사용자 건망증 비용을 지불하게합니다.
  • 암호 제한을 완화하십시오. "특수 문자를 사용할 수 없습니다"또는 "암호가 너무 깁니다"또는 "암호를 시작해야합니다"와 같은 쓸모없는 요구 사항 때문에 일부 웹 사이트에서 기본 암호를 허용하지 않을 때 우리 모두가 매우 짜증을났습니다. 편지와 함께. " 또한 사용 편의성이 암호 강도보다 큰 우려 사항이라면 더 짧은 암호를 허용하거나 문자 클래스를 혼합하지 않아도되는 멍청한 요구 사항을 완화 할 수 있습니다. 제한이 완화되면 사용자는 잊지 못할 암호를 사용하게됩니다.
  • 암호를 만료시키지 마십시오.
  • 사용자가 이전 암호를 다시 사용할 수 있도록 허용합니다.
  • 사용자가 자신의 비밀번호 재설정 질문을 선택할 수 있도록 허용합니다.

그러나 어떤 이유로 (그리고 이유를 말해주십시오) 실제로 복구 할 수있는 암호를 가질 수 있어야 할 필요가있는 경우 잠재적으로 다른 온라인 계정을 손상시키지 않도록 사용자를 보호 할 수 있습니다. 기반 인증 시스템. 사람들은 이미 사용자 이름 / 암호 시스템에 익숙하고 잘 훈련 된 솔루션이기 때문에 이것은 최후의 수단이 될 것입니다. 그러나 암호에 대한 창조적 인 대안은 분명 많습니다.

  • 사용자가 숫자 핀을 선택하도록합니다. 4 자리 숫자는 사용하지 않는 것이 좋으며, 바람직하게는 무차별 대입 시도가 보호되는 경우에만 가능합니다.
  • 사용자가 답을 알고 있고, 변경하지 않으며, 항상 기억할 것이며, 다른 사람들이 알아내는 것을 꺼리는 짧은 대답으로 질문을 선택하게하십시오.
  • 사용자가 사용자 이름을 입력 한 후 추측을 방지 할 수 있도록 충분한 순열을 가진 기억하기 쉬운 모양을 그리게하십시오 (G1에서 전화 잠금을 해제하는 방법에 대한 이 멋진 사진 참조).
  • 어린이 웹 사이트의 경우 사용자 이름 (identicon과 같은 종류)을 기반으로 퍼지 (fuzzy) 생물을 자동으로 생성하고 사용자에게 생물체에게 비밀 이름을 지정하도록 요청할 수 있습니다. 그런 다음 생물의 비밀 이름을 입력하여 로그인 할 수 있습니다.

자격 증명 보안은 안전한 / 보안되지 않은 이진 작업이 아닙니다. 보안은 위험 평가에 관한 것이고 연속체에서 측정됩니다. 보안 광신자는 이런 식으로 생각하는 것을 싫어하지만 추악한 진실은 아무 것도 완벽하게 안전하지 않다는 것입니다. 엄격한 암호 요구 사항, DNA 샘플 및 망막 스캔으로 해시 된 암호는보다 안전하지만 개발 및 사용자 경험을 희생합니다. 일반 텍스트 비밀번호는 안전성이 훨씬 떨어지지 만 구현하기가 저렴합니다 (그러나 피해야합니다). 하루가 끝나면 위반에 대한 비용 / 편익 분석이 내려집니다. 보호되는 데이터의 값과 시간 값에 따라 보안을 구현합니다.

누군가의 암호가 야생으로 들어가는 비용은 얼마입니까? 주어진 시스템에서 가장 (impersonation) 비용은 얼마입니까? FBI 컴퓨터는 비용이 엄청날 수 있습니다. Bob의 일회성 5 페이지 웹 사이트에 비용은 무시할 수 있습니다. 전문가는 고객에게 옵션을 제공하고 보안에 관해서는 모든 구현의 장점과 위험을 제시합니다. 클라이언트가 업계 표준을 따르지 않아 위험에 처할 수있는 무언가를 요청할 경우 이는 두 배입니다. 클라이언트가 특별히 양방향 암호화를 요청하면 귀하의 이의 제기를 문서화 할 수는 있지만 귀하가 알고있는 최선의 방법으로 구현하는 것을 방해해서는 안됩니다. 결국 고객의 돈이됩니다. 예, 단방향 해시를 사용해야 만하지만 그 선택은 절대적으로 유일한 선택이며 비 윤리적 인 것은 완전히 난센스입니다.

양방향 암호화로 비밀번호를 저장하는 경우 보안은 모두 키 관리로 귀착됩니다. Windows는 인증서 개인 키에 대한 액세스를 관리 계정과 암호로 제한하는 메커니즘을 제공합니다. 다른 플랫폼에서 호스팅하는 경우 해당 플랫폼에서 사용할 수있는 옵션이 무엇인지 확인해야합니다. 다른 사람들이 제안했듯이 비대칭 암호화를 사용할 수 있습니다.

단 하나의 방법으로 해시를 사용하여 암호를 저장해야한다는 것을 알 수있는 법은 없습니다 (영국의 데이터 보호법도 아닙니다). 이 법률에서 유일한 요구 사항은 보안을 위해 합리적인 조치가 취해 졌다는 것입니다. 데이터베이스에 대한 액세스가 제한되면 일반 텍스트 암호조차도 그러한 제한하에 합법적으로 자격을 얻을 수 있습니다.

그러나 이는 법적인 우선권이라는 또 하나의 측면을 밝혀줍니다. 법적인 우선권이 당신의 시스템이 만들어지는 업계에서 주어진 단방향 해시를 사용해야한다고 제안한다면 그것은 완전히 다른 것입니다. 그것이 당신의 고객을 설득하는데 사용하는 탄약입니다. 그것, 당신이 고객의 요구 사항을 부여 할 수있는 가장 안전한 방법으로 시스템을 구현하고, 합리적인 위험 평가를 제공하고, 귀하의 이의 제기를 문서화하는 가장 좋은 제안.


죄송합니다. 암호를 해독 할 수있는 방법이있는 한 안전 할 방법이 없습니다. 격렬하게 싸우고, 잃으면 CYA.


평상시처럼 사용자의 암호를 소금물에 담아 해시합니다. 사용자를 로깅 할 때 사용자의 암호 (염석 / 해시 후)를 허용하고 문자 그대로 입력 한 내용도 허용하십시오.

이것은 사용자가 자신의 비밀 암호를 입력 할 수있게 해주지 만, 데이터베이스에서 읽는 암호 인 암호의 해시 / 해시 버전을 입력 할 수도 있습니다.

기본적으로 소금으로 처리되거나 해시 된 암호를 "일반 텍스트"암호로 지정하십시오.


포기하지 마라. 고객을 설득하는 데 사용할 수있는 무기는 거부 불가 성입니다. 어떤 메커니즘을 통해 사용자 암호를 재구성 할 수 있다면 고객은 합법적 인 부인 방지 메커니즘을 제공하고 공급자가 암호를 재구성하지 않았다는 것을 증명할 수있는 방법이 없기 때문에 해당 암호에 의존하는 모든 트랜잭션을 거부 할 수 있습니다 거래를 스스로 처리하십시오. 패스워드가 암호문이 아닌 다이제스트로 올바르게 저장된다면 이것은 불가능합니다. 최종 클라이언트가 트랜잭션을 직접 수행하거나 암호로 관리해야합니다. 두 경우 모두 그와 직면하게됩니다. 나는 그것이 수억 달러에 이르는 경우에 대해 연구했다. 당신이 잘못하고 싶어하는 것이 아닙니다.







password-storage