비밀번호 재사용을“보호”하기 위해 제출하기 전에 클라이언트에서 웹 페이지에서 비밀번호를 해시하고 서버에서 다시 해시하는 웹 페이지가 거의없는 이유는 무엇입니까?


46

인터넷에는 로그인 정보가 필요한 사이트가 많이 있으며 암호 재사용을 방지하는 유일한 방법은 서버에서 암호가 해시되는 "약속"입니다. 항상 그런 것은 아닙니다.

그래서 클라이언트 컴퓨터에서 암호를 해시하는 웹 페이지 (Javascript로)를 다시 해시 할 서버로 보내기 전에 얼마나 어려운지 궁금합니다. 이론적으로 이것은 추가 보안을 제공하지는 않지만 실제로는 서버에서 비밀번호를 해시하지 않는 "불량 사이트"로부터 보호하는 데 사용될 수 있습니다.


18
서버가 해시를 비교하는 중이라면 클리어에서 전송 된 해시 암호는 클리어에서 전송 된 암호보다 낫지 않습니다. 중간 공격의 사람은 이런 종류의 "보안"을 좋아합니다.

3
가장 좋은 해결책은 클라이언트 측 비밀번호 관리자 (imo)입니다. 이렇게하면 임의의 문자열을 암호로 생성 할 수 있으며 서버를 사용하여 '보호'하지 않아도됩니다.
딘 하딩

2
@Jarrod-다른 클라이언트 측 해싱 알고리즘을 사용하는 다른 웹 사이트처럼 그 만화가 묘사 한 공격을 막을 수 있습니다. 널리 재사용되는 하나의 암호는 서로 다른 해시 알고리즘을 통해 다른 암호가됩니다. 클라이언트 측 해시 계산으로 보안 연결을 통해 해시를 보내는 것과 같은 다른 종류의 보안이 적용되는 것을 막을 수는 없습니다.
Steve314

2
@ Steve314 내 요점은 클라이언트의 모든 것이 기본적으로 손상된다는 것입니다. 클라이언트에서 수행되고 서버에서 앞뒤로 전달되는 경우 해시 및 해시 및 해시 clear가 가능합니다. 나는 상속받은 시스템을 수정해야했는데, 그것은 당신과 OP가 묘사하는 것과 똑같은 방식으로 설계되었습니다. Wireshark를 가진 십대들에 의해 끊임없이 해킹당했습니다. 우리는 REAL암호화를 넣고 서버와의 모든 페이로드를 암호화하고 서명 했을 때만 잠금을 해제 했으며 계정 조작이 중지되었으며 그 후에는 다시는 발생하지 않았습니다.

5
불량 사이트로부터 자신을 보호하려는 계획은 불량 사이트에 더 나은 보안을 설정하도록 요청하는 것 같습니다. ?
pc1oad1etter

답변:


46

왜 사용되지 않습니까? 제로 게인에 대한 추가 작업이 많기 때문입니다. 이러한 시스템은 더 안전하지 않습니다. 심지어 수 있습니다 이, 더 안전한 것 (암호 재사용, 사전 암호 등 같은) 덜 안전한 방법을 채택하는 사용자를 선도의 잘못된 인상을주기 때문에 보안.


2
이것이 지금까지 가장 좋은 대답입니다.

1
Blu-Ray 및 DVD 암호화와 같습니다. 잠금을 해제하기 위해 키가 필요하지 않습니다. 그것이 제공 한 유일한 "보호"는 DVD가 처음 나왔을 때 영화의 전체 사본을 구입하는 것보다 디스크를 구입하는 데 비용이 더 든다는 것입니다. 물론 지금 당신은 1 달러에 DVD를 구입할 수 있으며, 더 중요한 것은 지금 열쇠가 공개 지식이라는 사실입니다. Blu-Ray도 마찬가지입니다
Michael Brown

2
암호를 클라이언트쪽에 해시하면 보안이 강화된다고 생각합니다. 듣고 있다면 비밀번호가 아닌 해시 만 볼 수 있습니다. 서버가 요청을 보내면 해시는 재사용 할 수 없습니다.
Andomar

2
x4u의 접근 방식은 유선으로 암호를 전송하는 것과 인증서를 사용하는 것 사이에 보안 요구 사항이있는 일부 응용 프로그램에 매우 적합 할 수 있습니다. 나는 몇몇 사람들이 표준 서버 측 자격 증명 처리 외에도 암호를 입력하기 전에 해싱이 수행 되는 것을 간과하고 있다고 생각 합니다. 따라서 문제는 이것입니다. x4u의 제안은 암호로 전송되는 무선 시나리오에서 보안을 향상시킬 수 있습니까? 나는 그렇게 말한다. 이것을 실현하는 열쇠는 암호 당 소금의 사용에 있습니다.
LOAS

6
MITM 공격을 방지하는 올바른 방법은 종단 간 암호화입니다. TLS (https)가 있습니다. 사용하십시오. 자신의 암호 체계를 발명하지 마십시오.
Rein Henrichs

14

이론적으로 이것은 추가 보안을 제공하지는 않지만 실제로는 서버에서 비밀번호를 해시하지 않는 "불량 사이트"로부터 보호하는 데 사용될 수 있습니다.

이것이 정확히 당신을 어떻게 보호합니까? 당신이하고 싶은 것은 무의미한 해시 암호를 해시하는 것입니다. 해시 된 비밀번호가 비밀번호가되기 때문입니다.

인터넷에는 로그인 정보가 필요한 사이트가 많이 있으며 암호 재사용을 방지하는 유일한 방법은 서버에서 암호가 해시되는 "약속"입니다. 항상 그런 것은 아닙니다.

하나 이상의 사이트에 동일한 비밀번호를 사용하지 않는 것은 어떻습니까. 이론적으로 웹 사이트에서 비밀번호를 해시하는 이유는 계정이 노출 된 경우 귀하의 계정에 대한 액세스를 차단하기 위해서입니다. 여러 웹 사이트에 동일한 암호를 사용하는 것은 어리석은 일입니다.

자바 스크립트를 사용했다면, "해커"가 해쉬 된 해시 암호에서 같은 방법을 사용하면됩니다. 일단 해시 된 정보를 확보 한 후에는 계정 액세스를 방해하는 요소 인 데이터베이스에서 비밀번호-> 동일한 해시를 계산하는 데 걸리는 시간입니다.


1
브라우저가 항상 같은 방식으로 해시하면 해시를 다른 곳의 암호로 사용할 수 있습니다. 그러나 브라우저가 해시하여 사이트로 보내기 전에 사이트 (도메인 일 수도 있음)를 기반으로 솔트를 할당하면 어떻게 될까요? 흥미로운 아이디어라고 생각합니다.
Tesserex

2
그것이 클라이언트에 있다면, 그것이 타협되고, 클라이언트에있는 소금은 명백히 볼 수 있습니다. 이것은 비논리적 인 질문입니다. @Ramhound의 답변을 이해하지 못하면 보안이 필요한 코드를 작성해서는 안되며 처음부터 보안 및 암호화에 대해 읽으십시오.

3
원본 포스터를 인용 할 때 텍스트 형식을 지정하십시오 (텍스트를 선택하고 편집기 바로 위에 인용 부호 아이콘 사용)
Marjan Venema

1
Jarrod, 말도 안되는 주장을하기 전에 자신의 조언을 따르고 약간의 정보를 얻으십시오. 중간 공격에있는 사람은 적당한 소금 길이를 가진 안전한 해시 함수에 대해 쓸모가 없습니다. 그리고 내 제안은 결코 '불명확 한 보안'이 아니며, 현재이 분야 의 전문가 가 현재 알고 인정하는 것을 기반으로 안전 하며 많은 프로토콜에서 동일한 방식으로 사용됩니다. 그것은 내 발명품이 아니며 웹 사이트 로그인에 잘 이해 된 절차를 적용했습니다. 당신의 잘못된 가정은 다른 많은 사람들도 분명히 공유한다는 사실에 의해 아무런 의미도 얻지 못합니다.
x4u

3
클라이언트가 솔트를 알고 서버에서 일반으로 보내면 중간에있는 것도 잘 알고 있습니다. 절대 말하지 마십시오. 해시를 취소해야했습니다. 클라이언트의 소금을 알고 있다면 안전하지 않습니다.

11

가치가 거의 없거나 전혀 없기 때문에. 해싱의 이유는 데이터베이스가 해킹되면 해커가 유효한 암호 목록이없고 해시 만 있기 때문입니다. 따라서 사용자를 가장 할 수 없습니다. 시스템에 비밀번호를 모르고 있습니다.

보안은 SSL 인증서와 일부 인증 형식에서 제공됩니다. 사용자가 암호를 제공하여 해시를 계산할 수 있기를 원합니다.

또한 해싱 알고리즘은 서버의보다 안전한 영역에 있습니다. 숨겨진 참조 스크립트 파일 인 경우에도 클라이언트에 배치하면 Javascript의 소스 코드를 쉽게 얻을 수 있습니다.


3
이것이 가장 좋은 대답입니다. 전송 계층에서 암호화해야합니다. 그렇게하지 않으면 나머지는 안전하지 않습니다. 예, 암호화 기능을 작성할 수 있지만이 기능은 (악의적 인) 최종 사용자에게 표시됩니다. SSL을 사용하십시오.
pc1oad1etter

해싱 알고리즘의 보안은 비밀인지 여부에 의존해서는 안됩니다. 보안을위한 해싱 알고리즘은 단방향 함수 여야합니다. 코드가 있어도 실행 취소하기는 어렵습니다. 반대로, 비밀번호 전용으로 설계된 잘 알려진 해시 라이브러리를 사용해야합니다. 잘 알려지지 않았다면 거의 확실하거나 버그가 있습니다.
leewz

6

해결책은 그것보다 간단합니다. 클라이언트 인증서. 내 컴퓨터에서 클라이언트 인증서를 만듭니다. 웹 사이트에 등록 할 때 클라이언트 인증서와 서버 인증서를 사용하여 악수를합니다.

암호는 교환되지 않으며 누군가 데이터베이스를 해킹하더라도 내 클라이언트 인증서의 공개 키 (추가 보안 수준을 위해 서버에서 솔트하고 암호화해야 함)입니다.

클라이언트 인증서는 스마트 카드에 저장하고 마스터 암호를 사용하여 안전한 온라인 볼트에 업로드 할 수 있습니다.

이 모든 것의 장점은 피싱 개념을 제거한다는 것입니다. 웹 사이트에 암호를 입력하지 않고 해당 웹 사이트와 핸드 셰이 킹하는 것입니다. 그들이 얻는 것은 개인 키없이 쓸모없는 공개 키입니다. 유일한 취약성은 핸드 셰이크 중에 충돌을 발견하는 것이며 단일 웹 사이트에서 한 번만 작동합니다.

Microsoft는 Windows에서 Cardspace와 함께 이와 유사한 것을 제공하려고 시도했으며 나중에 공개 표준으로 제출했습니다. OAuth는 다소 유사하지만 중간 "발행자"에 의존합니다. 반면에 정보 카드는 자체 발급 될 수 있습니다. 그것은 암호 문제에 대한 진정한 해결책입니다 ... 암호를 모두 제거하십시오.

OAuth는 올바른 방향으로 나아가는 단계입니다.


5
클라이언트 인증서는 일부 사용 사례에 적합한 접근 방법이지만 웹 사이트 로그인에 쉽게 추가 할 수있는 것은 아닙니다. 사용자의 많은 협조가 필요하며 사용자 개인 키의 보안에 따라 다릅니다. 개인 키의 사용은 안전하거나 편리 할 수 ​​있지만 동시에 둘다는 아닙니다.
x4u

5

대부분의 답글은 클라이언트 쪽 비밀번호 해싱의 요점을 완전히 놓친 것 같습니다.

포인트입니다 하지 해시를 차단하는 것은 일반 텍스트 암호를 차단보다 더 안전하지 않기 때문에, 당신은에 로그인되어있는 서버에 안전하게 액세스 할 수 있습니다.

요점은 실제로 사용자 암호 를 보호 하는 것입니다. 대부분의 사용자는 여러 사이트에서 암호를 재사용하기 때문에 일반적으로 개별 사이트 로그인 액세스보다 훨씬 가치가 있습니다 (그렇지 않아야하지만 실제로는 그렇게하지 않아야합니다. ).

ssl은 mitm 공격으로부터 보호하는 데 유용하지만 서버에서 로그인 응용 프로그램이 손상되면 ssl은 사용자를 보호하지 않습니다. 누군가가 웹 서버에 악의적으로 액세스 한 경우 대부분의 경우 암호는 서버의 스크립트에 의해 해시되기 때문에 암호를 일반 텍스트로 가로 챌 수 있습니다. 그런 다음 공격자는 비슷한 사용자 이름을 사용하여 다른 (보통 더 가치있는) 사이트에서 해당 암호를 시도 할 수 있습니다.

보안은 철저한 방어이며 클라이언트 측 해싱은 단순히 다른 계층을 추가합니다. 자신의 사이트에 대한 액세스를 보호하는 것이 중요하지만 다른 사이트에서 암호를 다시 사용하기 때문에 사용자의 암호를 보호하는 것이 훨씬 중요합니다.


2
받아 들여진 대답은 당신의 요점을 아주 잘 공유합니다. "대부분의 답글"은 그렇지 않지만 귀하의 답변이 실제로 많은 가치를 부여하지는 않기 때문에이 질문을 부활시킬 필요는 없습니다.
Frank

아마도 답변 (응답 답변 댓글 스레드에 추가하는 방법을 모색하지 않은 것에 대한 사과)보다 주석 일 가능성이 높으며, 내 대답이 수락 된 답변에 공유되어 있어도 대답이 보였기 때문에 분명히 명확하지 않았습니다. 아직도 그것을 솔질하기 위하여. 피드백을 주셔서 감사합니다
crutchy

@ 응답 할 수있는 경계선이 너무 길어서 독서를 방해하기 어렵다. 이것이 어떻게 구현 될 수 있는지에 대한 너무 많은 세부 사항으로 들어가고 결국 이익을 극복하는 것입니다. 다른 답변에 TL; DR이 있으면 유익합니다.
Jules

2
@ 줄스 : 편집이 존재하는 이유입니다.
Robert Harvey

1
@JarrodRoberson 더 이상 안전 하지 않은 보안 을 혼동 하지 않는다고 생각 하십니까? MITM이 발생하면 사이트에 대한 액세스가 이미 포기 된 것입니까? 암호 대신 클라이언트 인증서를 사용하지 않으면 일반 사용자에게는 지나치게 복잡 합니다. 내가 보는 것처럼 클라이언트 측 해싱은 각 해싱 알고리즘이 고유하다고 가정 할 때 다른 사이트에서 동일한 암호가 손상되는 것을 방지합니다. 더 안전하지는 않지만 어느 쪽도 덜 안전하지 않습니까? 근데 왜 이걸 너무 열심히 밀어? 나는 메타에서 이것을 발견했으며 이것이 지금까지 내가 본 가장 좋은 대답입니다.
zypA13510

1

확실히 가능하며 실제로 웹 사이트를 기다릴 필요가 없습니다.

SuperGenPass를 살펴보십시오 . 북마크입니다.

단순히 비밀번호 필드를 인식하고, 웹 사이트 도메인에 입력 한 내용을 연결하고, 해시하고, 비밀번호에 "허가 된"문자 만 가져 오도록 약간 엉킨 다음 해시 된 비밀번호 만 유선으로 전송됩니다.

프로세스에서 사이트 도메인을 사용하면 항상 동일한 비밀번호를 재사용하더라도 사이트 당 고유 한 비밀번호를 얻을 수 있습니다.

매우 안전하지는 않지만 (base64-MD5) 원하는 경우 sha-2 기반 구현을 완벽하게 배포합니다.

도메인이 변경되면 유일한 단점은 암호를 직접 복구 할 수 없기 때문에 웹 사이트에 암호를 재설정하도록 요청해야한다는 것입니다 ...하지만 자주 발생하지는 않습니다. 허용 가능한 균형.


이것이 제가 질문을 읽을 때 생각했던 것입니다. 사이트가 자체 클라이언트 측 해싱을 수행하는 것은 사실상 쓸모가 없지만 도메인을 기반으로 한 소금을 사용하여 브라우저를 확장하면 암호 재사용과 관련된 위험이 효과적으로 무효화됩니다. 물론 재미있는 부분은 다른 컴퓨터에서 로그인을 시도 할 때 발생합니다.
Aaronaught

3
이것은 암호를 전달하는 다른 체계보다 더 이상 안전하지 않습니다. 암호는 고유하지만 여전히 암호화되지는 않지만 중간에 서버가있는 경우 복잡하지만 여전히 명확한 암호를 가져 와서 원하는만큼 사용할 수 있습니다. 변경되지 않습니다. 해시는 마법의 총알이 아니며 암호화조차 아니며 암호화 해시라고하지만 이것이 암호화라는 것을 의미하지는 않습니다. 내 비밀번호가 중요 password하거나 password클라이언트에게 알려진 소금이 포함 된 SHA-256 이면 상관 없습니다 . 중간 연결에있는 사람이이를 캡처 할 수 있습니다.

@Jarrod Roberson : 물론 암호를 사용할 수는 있지만 다른 내 계정에 암호를 재사용 할 수는 없습니다. 따라서 내가 연결하는 웹 사이트 중 하나가 자신의 암호베이스를 도난 당하고 투명하게 저장하면 내 다른 계정은 안전합니다.
Matthieu M.

@Aaronaught : 그것이 실제로 빛나는 곳입니다. 전송 된 비밀번호는 사용자가 로그온 한 웹 사이트 도메인과 선택한 마스터 비밀번호에서 온 것이므로 북마크릿이있는 한 모든 컴퓨터 (및 브라우저)에서 로그인 할 수 있습니다. 이것이 인증서보다 다소 편안한 이유입니다.
Matthieu M.

6
@Jarrod : 이것은 사이트 에 대한 보안 조치가 아니라 사용자에 대한 보안 조치입니다 . 모두가 이와 같은 구성표를 사용하면 암호 재사용은 문제가되지 않습니다. MITM 체계는 클라이언트 해시 암호를 사용하여 해당 사이트 에만 액세스 할 있지만 해당 사이트 에만 액세스 할 수 있습니다. 그것이 개선이있는 곳입니다. 일반적으로 비밀번호를 재사용 할 가능성이 높기 때문에 하나의 비밀번호 만 크랙 하면 많은 계정에 액세스 할 수있을 것으로 예상됩니다 . 이 경우, 크랙 된 암호는 실제 발견 된 사이트 나 데이터베이스에만 유효하다는 것이 실제로 보장됩니다.
Aaronaught

0

나는 X4u의 답변을 좋아하지만, 내 의견으로는 브라우저 / HTML 사양에 통합되어야한다고 생각합니다. 현재 답변의 절반에 불과합니다.

여기에 사용자로서의 문제점이 있습니다. 데이터베이스에 저장할 때 다른 쪽 끝에서 비밀번호가 해시되는지 여부는 알 수 없습니다. 나와 서버 사이의 줄은 잘 암호화되어 있지만 목적지에 도달하면 비밀번호가 어떻게되는지 전혀 알 수 없습니다. 아마 일반 텍스트로 저장 될 수도 있습니다. 데이터베이스 관리자는 데이터베이스 판매를 끝낼 수 있으며,이를 알기 전에 전 세계가 사용자의 비밀번호를 알고 있습니다.

대부분의 사용자는 비밀번호를 재사용합니다. 기술을 잘 모르는 사람은 더 잘 모르기 때문입니다. 기술적 인 사람들은 일단 15 번째 암호에 도달하면 대부분의 사람들은 암호를 적어 두지 않으면 기억할 가능성이 없기 때문입니다 (우리 모두도 나쁜 생각입니다).

Chrome 또는 IE 또는 내가 사용하는 것이 암호 상자가 서버에서 생성 된 소금을 사용하여 클라이언트 측에서 즉시 해시되고 암호 자체를 효과적으로 샌드 박스로 만들 것이라고 말할 수 있다면 사용자로서 재사용 할 수 있음을 알 것입니다 위험이 적은 암호. 나는 여전히 암호화 된 채널을 원할뿐만 아니라 전송 중에 처마가 떨어지는 것을 원하지 않습니다.

사용자는 자신의 비밀번호를 서버로 전송할 수 없으며 해시 만 사용할 수 있음을 알아야합니다. 현재 X4U 솔루션을 사용하는 경우에도 해당 기술이 사용 중인지 알 수 없기 때문에 이것이 사실인지 알 방법이 없습니다.


1
그것은 브라우저 조회 다이제스트 인증에 통합되어 있으며 추가 정보와 함께 비밀번호를 해시하고 서버에서 확인되는 비밀번호를 얻기 위해 http에서 취해진 앞뒤 단계를 볼 수 있습니다.
gbjbaanb

-1

프레임 워크, CMS, 포럼 소프트웨어 등과 같이 설치 될 서버를 제어하지 않는 것을 구축 할 때 사용하는 것이 좋은 방법이라고 생각합니다. 즉, 로그인 및 로그인 된 활동에 항상 SSL을 사용하는 것이 좋습니다. 그러나 framework / cms를 사용하는 일부 사이트에는 SSL이 없으므로 여전히 혜택을 누릴 수 있습니다.

다른 사람들이 지적했듯이, 여기서 이점은 MITM 공격으로 다른 사람 이이 특정 사이트에 로그인 할 수 없다는 것이 아니라 공격자가 동일한 사용자 이름 / 암호 콤보를 사용할 수 없다는 것입니다 계정이있는 수십 개의 다른 사이트에 로그인하십시오.

이러한 체계는 임의의 소금 또는 사이트 별 및 사용자 이름 별 소금의 콤보로 소금을 사용해야 암호를 얻는 사람이 다른 사이트에서 동일한 사용자 이름으로 사용할 수 없습니다 (동일한 해싱 구성표를 사용하는 사이트조차도) ) 또는 같은 비밀번호를 가진 사이트 사이트의 다른 사용자를 상대로하지 않아야합니다.

다른 사람들은 사용자가 사용하는 모든 단일 사이트에 대해 고유 한 암호를 만들거나 암호 관리자를 사용해야한다고 제안했습니다. 이것은 이론 상으로는 건전한 조언이지만, 우리는 이것이 현실 세계에 의존하는 것이 어리 석다는 것을 알고 있습니다. 이 중 하나를 수행하는 사용자의 비율은 적으며 곧 변경 될 것으로 의심됩니다.

따라서 자바 스크립트 암호 보유자는 사이트 소유자와 최종 사용자 모두가 무시할 경우 프레임 워크 / cms 개발자가 운송 중 암호를 가로채는 사람 (요즘 Wi-Fi 네트워크를 통해 쉽게)을 제한하기 위해 할 수있는 최소한의 것입니다. 보안에 관한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.