HTTPS가없는 상태에서 Javascript를 사용하여 HTTP를 통해 안전하게 비밀번호를 보내는 방법은 무엇입니까?
모든 개발자가 직면하는 가장 기본적인 문제 : 사용자가 양식을 제출할 때마다 암호는 네트워크를 통해 전송되며 보호되어야합니다. 내가 개발 한 사이트에는 HTTPS가 없습니다. 소유자도 SSL 인증서를 구입하고 싶어하지 않으며 자체 서명 된 인증서에도 관심이 없습니다. 그래서 양식을 제출할 때 Javascript를 사용하여 HTTP를 통해 보낸 비밀번호를 보호하고 싶습니다.
열렬한 반대 투표자에게 : HTTP를 통해 안전하게 비밀번호를 보내는 방법은 무엇입니까? 현명한 해결책을 제공하지 않으며 다른 상황에 있습니다.
MD5를 사용하면 해당 암호 문자열을 뒤집을 수 있습니다. nonce / HMAC는 어떻습니까? 사용 가능한 Javascript 라이브러리가 있습니까? 아니면 해결해야 할 제안 / 힌트가 있습니까? 미리 감사드립니다!
사용자가 SSL없이 확인할 수 있는 암호를 안전하게 보낼 수있는 방법은 없습니다 .
물론 해싱 또는 공개 키 암호화를 통해 무선 전송을 위해 암호를 안전하게 만드는 JavaScript를 작성할 수 있습니다. 그러나 사용자는 JavaScript 자체가 중간자 (man-in-the-middle)에 의해 변경되지 않았는지 확인하고, 사이트 대신 공격자에게 암호를 보내거나, 심지어 보안을 손상시킬 수 있습니다. 연산? 유일한 방법은 전문 프로그래머가되어 페이지와 스크립트의 모든 행을 검사하여 암호를 입력하기 전에 정결한지 확인하도록하는 것입니다. 그것은 현실적인 시나리오가 아닙니다.
man-in-the-middle 공격으로부터 암호를 안전하게하려면 SSL 인증서를 구입해야합니다. 다른 방법은 없습니다. 그것에 익숙해.
MD5를 사용하면 해당 암호 문자열을 뒤집을 수 있습니다.
아뇨 ... 최소한 사소한 건 아닙니다. MD5에 대한 공격이 있지만 해싱 알고리즘이므로 되돌릴 수 없습니다. 당신은 그것을 무차별 대입해야 할 것입니다.
그러나 다시 말하지만, man-in-the-middle 공격자는 MD5를 볼 필요가 없습니다. 그는 MD5를 만들기 위해 사용자에게 보내는 JavaScript를 방해 할 수 있습니다.
여기서 해결책은 암호를 전혀 보내지 않는 것입니다. 챌린지 / 응답을 사용합니다.
원래 형식에는 키와 함께 임의의 큰 텍스트 블록이 포함됩니다. 서버의 키를 기반으로 세션에 원본 임의 텍스트를 저장합니다. 클라이언트가 양식을 제출할 때 JS를 사용하여 임의의 텍스트와 비밀번호를 함께 해시하십시오. 그런 다음 사용자 이름, 키 및 해시 된 임의의 텍스트를 서버로 보냅니다. 암호를 보내지 마십시오. 서버에서 키를 사용하여 원본 임의 텍스트를 조회하고 저장된 암호로 동일한 해싱 작업을 수행합니다. 서버 해시 값이 클라이언트 해시 값과 일치하면 클라이언트가 서버에 암호를 보내지 않고 올바른 암호를 입력했음을 알 수 있습니다.
암호가 올바른지 여부에 관계없이 키와 임의의 텍스트를 만료하여 각각 한 번만 사용할 수 있도록합니다.
이 사실에 대해 자세히 알아 보려면 "서로 사전 지식이없는 두 당사자가 안전하지 않은 통신 채널을 통해 공유 비밀 키를 공동으로 설정할 수 있도록 허용"하기 위해 만들어진 Diffie-Hellman 키 교환 을 살펴보십시오.
저는 암호화 전문가가 아니기 때문에 공격자가 클라이언트 (JavaScript 소스 코드)와 전송 메커니즘 (패킷 스니퍼)을 모두 가지고 있다면 이것이 정말 안전한지 완전히 알 수 없습니다.
전송하기 전에 javascript RSA 구현을 사용하여 비밀번호를 암호화 할 수 있습니다. (다음은 RSA In Javascript 의 예입니다 .)
그러나 나는 이것과 해시 함수를 사용하는 것이 재생 공격에 취약 할 것이라고 믿는다 . 그러니 조심해.
안타깝게도 암호화되지 않은 요청의 보안을 보장 할 방법은 없습니다. 자바 스크립트에 액세스 할 수있는 사람은 누구나 간단히 그것을 리버스 엔지니어링 / 조작 할 수 있으며 패킷 스니퍼를 가진 사람은 암호화되지 않은 트래픽을 볼 수 있습니다. 이 두 가지 사실은 다음을 의미합니다.
SSL이 없습니까? 보안이 없습니다.
당신이 가지고있는 모든 전송은 분명 할 것입니다. 즉, SSL이 없으면 중요한 정보가 노출됩니다. 사이트 소유자와 그 점에 대해 논의 할 가치가 있습니다. 즉, 데이터 전송을 강화하기 위해 필요한 조치를 취하는 것이 가장 좋으며 SSL은 기본적이고 저렴한 단계 중 하나입니다.
여기서 문제는 기술이 아니라 SSL의 중요성을 설명하는 방법이라고 생각합니다. 신뢰할 수있는 읽기 자료를 제공하십시오. 웹에는 많은 자료가 있습니다.
이 솔루션을 사용하려면 클라이언트가 클라이언트 와 서버 에만 알려진 비밀 암호화 키를 사용하여 암호를 암호화 할 수 있어야 합니다.
SSL은 서버와 클라이언트 웹 브라우저 모두에 자체 비대칭 공개 / 개인 키 쌍을 갖도록 요구하여이를 수행합니다.이 키 쌍은 이들간에 임의의 세션 키를 암호화하고 전송하는 데 사용됩니다. 나머지 대화는 보안 세션 키를 사용합니다.
따라서 클라이언트와 서버 에만 알려진 비밀 키의 이점없이 SSL과 동일한 문제를 해결하는 방법을 묻고 있습니다. 나는 전문가는 아니지만이 일을 할 수 없거나 적어도 쉽게 할 수없는 것 같습니다.
SSL에 액세스 할 수없는 경우 MD5는 실수로 암호를 검색하는 것을 방지하는 데 적합해야합니다 (예 : 네트워크 로그 파일 등). 다른 것은 시간 낭비입니다. 앱이 민감한 정보 (예 : 신용 카드 번호, 병력 등)에 대한 액세스 권한을 부여하지 않는지 확인하십시오.
다른 댓글 작성자가 제안한 것처럼 심각한 공격자는 페이지에있는 모든 유형의 보안을 깰 수 있습니다. 대부분의 사용자가 추측하기 쉬운 암호를 사용하고, 어디서나 동일한 암호를 재사용하거나, 요청하는 사람에게 암호를 제공하거나, 복사 된 페이지 또는 "기술"을 통해 암호를 포기하도록 속일 수 있기 때문에 SSL조차도 작은 장벽입니다. 지원 "전화.
-영어-뭔가 생각하지만 정말 안전 할 수 있을지 모르겠습니다. 양식을 php 파일에 넣을 수 있다면 시간이나 다른 것을 기반으로 문자열을 생성하는 알고리즘을 만든 다음이 문자열을 html에 넣을 수 있습니다.
사용자가 암호 입력 필드에 암호를 입력하면 디버그 할 때 사용자가 입력 한 값을 볼 수 없으므로 post 또는 get을 통해 정보를 보내기 전에 암호 사용자를 힌트로 사용하여 암호화 된 문자열을 미리 암호화 할 수 있습니다. 생성 된 후 사용자가 입력 한 암호를 입력하여 전송했습니다.
이런 식으로 공격자는 js 코드 내부에 모든 것을 가지고 있지 않으므로 암호 해독을 위해 생성 한 알고리즘을 발견해야합니다.
이것은 단지 생각 일 뿐이므로 이것이 어떻게 안전하지 않을 수 있는지 알려 주시면 감사하겠습니다.
-스페인어-Se me acaba de ocurrir algo que puede servir, pero no se si realmente sea algo seguro. Por medio de php puedes generar un algoritmo que cree un string en base al timestamp o algo más, y después colocar esta cadena en el html.
참고 que cuando alguien escribe una contraseña en un campo input tipo password, con un debug no se puede ver el valor que tecleo el usuario (no se si exista manera pero no quise investigar más), asi que podemos utilizar la contraseña que el usuario escribió como palabra clave para encriptar la cadena de texto que previamente habiamos generado con php, por medio de un algoritmo en JS. Sería algo así como encriptar lo encriptado. Posteriormente lo que estariamos enviado no sería la contraseña tecleada, si no esta última cadena resultante.
Buscando un contra, lo único que se me ocurra es que el atacante tendrá que dedicarle mucho tiempo para tratar de encontrar el agoritmo que creamos por medio de php y poder decriptar la cadena final, o tendrá que hackear el servidor para acceder al php y obtener 엘 알고 리트 모.
Esto es solo una idea, por lo que si pueden decirme como esto puede no ser seguro, se los agradecería.
언급했듯이 클라이언트 측 자바 스크립트를 신뢰할 수있는 기능이 필요하므로이 중 어느 것도 서버 스푸핑 에 대해 안전하지 않습니다 . 그러나 서버가 스푸핑 될 수는 없지만 (서명 된 인증서, 길이 확장에 영향을받지 않는 해시 서명 등) 연결이 도청에 영향을받지 않는다고 확신하는 경우,이를 구현하는 방법은 다음과 같습니다.
가장 안전한 방법은 H ( password ) 를 저장하는 대신에 H가 선택한 해시 함수 인 경우 g ^ H ( password )를 저장하는 것입니다. 즉, 암호를 Diffie-Hellman 키 교환을위한 개인 키로 사용하는 것입니다. (또한 다른 사용자에게도 임의의 g를 사용해야합니다. 이것이 여러분의 솔트가됩니다.) 그런 다음, nonce b를 생성하고 사용자 g ^ b를 보내고 (g ^ H ( password )) ^를 계산합니다. 비. 사용자는 g를 알 필요가 없습니다. (g ^ b) ^ H ( password ) = (g ^ H ( password )) ^ b 만 계산하면됩니다 . 지금 당신은 양 당사자가 알고있는 번호가 IFF 사용자가 올바른 암호를 입력하고 올바른 번호를 아는 것을 기반으로 챌린지 응답 영 지식 증명을 구성하는 것은 사소한 반면, 서버의 "개인 키"로 사용되는 난수는 접근 방식이 재생 공격에 영향을주지 않도록합니다.
'Program Club' 카테고리의 다른 글
| 클래스와 메서드에서 @Transactional을 정의하는 것의 차이점은 무엇입니까 (0) | 2020.12.29 |
|---|---|
| LOAD DATA LOCAL, 첫 줄을 어떻게 건너 뛰나요? (0) | 2020.12.29 |
| .NET 응용 프로그램에서는 SQL 쿼리가 느리지 만 SQL Server Management Studio에서는 즉각적입니다. (0) | 2020.12.29 |
| 대지의 입력 문자열에서 개행 문자를 제거하는 가장 쉬운 방법 (0) | 2020.12.29 |
| C # 델리게이트가 필요한 이유 (0) | 2020.12.29 |