2010-05-09 4 views
5

그래서 사용자가 웹을 통해 인증하도록하려는 모바일 플랫폼 응용 프로그램에서 작업하고 있습니다. 나는 보안을위한 최선의 방법을 궁금해하고 있었다. 사용자는 동일한 서버의 mysql 데이터베이스에 대해 인증하는 PHP 서버에 HTTP 암호를 보냅니다. 분명히 인터넷을 통해 일반 텍스트로 암호를 보내지 않고 싶지만 2 개의 SHA 해시도 수행하고 싶지 않습니다.웹에서 비밀번호 보내기

이 서버가

$pass = $_POST['pass']; 

if ((get PASSWORD where USERNAME = USERNAME) == SHA($pass)) return PASS; 

이 꽤 표준이며 나는이 작업을 수행하는 다른 방법이 있다고 생각하지 않습니다 (의사의) 모습입니다. 그러나 나는 인터넷을 통해 데이터를 보내기 전에 어떻게 데이터를 준비해야하는지 궁금합니다.

답변

10
  1. 보안을 원하면. 절대로 필요한 것. 용도. HTTPS. 적절한 비 자체 서명 인증서. 어떤 일을하든간에 암호화되지 않은 통신에서 인증 된 ID는 훔치기 쉽지 않습니다. 암호를 잊어 버리면 공격자가 요청할 때마다 제공되는 세션 쿠키를 훔칠 수 있습니다.
  2. 해싱 자체는 가치가 없으므로 소금을해야합니다. (이것은 인증과 관련이 없으며, 누군가가 데이터베이스를 훔칠 때 방어의 두 번째 계층입니다. 유망한 목표가 될 경우 조만간 발생할 수 있습니다.) bcrypt를 사용자 당 긴 임의의 소금과 함께 사용하십시오. sha *는 너무 빠르기 때문에 안전하지 않습니다.
  3. 대규모 보안 인식 프로젝트에서 이미 사용하고있는 방법을 사용하십시오. 그 방법들은 어느 정도 시간의 테스트에 어려움을 겪어 왔습니다. 어떤 형태로든 암호를 보내는 것을 피하는 Challenge-Response 기반의 방법이 있지만 암호는 어렵고 안전하지 않은 방식으로 보안 알고리즘을 구현하는 것은 매우 쉽습니다.훌륭한 보안 프레임 워크 (예 : PHPass)를 사용하고 널리 사용되지 않는 코드에 의존하지 마십시오.
+0

+1은 내 것보다 훨씬 상세한 대답입니다. –

+0

답변을 주셔서 감사합니다. 웹 프로그래밍에 익숙하지 않아서 보안에 대해 좀 더 배우는 방법을 모색해야 할 때입니다. 이 기술들이 어떻게 작동하는지에 대한 전반적인 그림을 줄 수있는 안내서가 있습니까? 더 자세한 정보는 사용자가 애플리케이션에서 사용자 이름/비밀번호를 만들어야하는 안드로이드 프로그램입니다. 그런 다음 사용자가 휴대 전화와 상호 작용할 수 있도록 웹 인터페이스를 구현할 것입니다. 암호가 인터넷을 통해 전송되는 유일한 시간은 사용자 생성시입니다. – Falmarri

4

클라이언트 응용 프로그램에서 지원하는 경우 SSL을 사용할 수 있습니다.

0

Pekka가 지적했듯이 SSL이 가장 좋습니다.

대신 JavaScript에서 SHA를 사용하는 것은 매우 쉽고 빠르며 이미 작성되었습니다.

+0

직접 구현할 필요가 없습니다. 이미 그렇게하는 매우 좋은 libs가 있습니다. 예를 들어 Crypto.js의 경우 여기에 대해 썼습니다 : http://techpriester.tumblr.com/post/547863016/crypto-js-by-jeff-mott – selfawaresoup

+0

내 링크에는 예제 라이브러리가 있습니다. 나는 그 말을 잘 듣고있다. –

0

일반 중요하지 않은 시스템의 경우 대부분의 웹 사이트는 http 게시물 요청 중에 인터넷을 통해 일반 텍스트로 비밀번호를 전송합니다. 암호는 SHA1/MD5에 의해 서버 쪽에서 인코딩되고 데이터베이스의 값과 비교하여 검사됩니다.

https basic authentication을 사용할 수도 있습니다. 간단한 알고리즘으로 비밀번호를 인코딩합니다. 그러나 일반 텍스트로 암호를 보내지는 않지만 인코딩이 매우 간단해서 깨지기 쉽습니다 (매우!). 그러나 기본 인증을 사용하면 일반 로그인 양식을 사용할 수 없기 때문에 브라우저에서 기본 인증을 지원해야합니다 (친숙하지는 않습니다!).

더 많은 보안이 필요한 경우 대부분의 웹 사이트에서는 ISP에서 구입하는 서버 측 SSL 인증서 (예 : godaddy) 만 설치하면됩니다. 이렇게하면 SSL 암호화 연결을 통해 로그인 스크립트에 액세스 할 수 있습니다. 이 솔루션은 암호로 추측하거나 도난 당하지 않는 한 안전한 것으로 간주됩니다.

흥미롭지 만 흔치 않은 접근 방식은 서버에 (Ajax) 게시물 요청 (JS sha-1 example)을 보내기 전에 JavaScript에서 SHA1 인코딩을 수행하는 것입니다. 이론상으로 이것은 매우 합리적인 보안을 제공 할 수 있습니다 ...

그리고이 모든 것이 아직 충분하지 않은 경우 client certificates 또는 계산기 나 SMS를 사용하여 응답 시도 시스템을 설치하는 것을 고려할 수 있습니다.

+3

나는 보내기 전에 sha1 인코딩을하는 것에 동의하지 않습니다. 이 방법으로 sha1 해시는 암호로만 작동하며 네트워크 트래픽을 스니핑하는 사람은 원래 암호를 알 필요없이 서버에 해시를 보낼 수 있습니다. 또한 JS를 지원하지 않는 사람들이 액세스 할 수 없게하거나 서버가 어떤 종류의 비밀번호 (해시 또는 해시 없음)를 감지해야 함을 의미합니다. –

+3

서버는 소금을 보낼 수 있고, 클라이언트는 소금에 절인 해시를 계산할 수 있고, 임의의 문자열을 추가하고, 해시를 다시 입력하고, 두 번째 해시와 임의의 문자열을 다시 전송할 수 있으며, 서버는 저장된 암호 해시에 임의의 문자열을 추가하여이를 확인할 수 있습니다 그리고 다시 해싱. 잡아 당기기가 약간 복잡하기는하지만 (로그인하려면 두 가지 요청이 필요합니다.) 통신을 모니터 할 수는 있지만 중간자 공격을 당할 수는없는 공격자에 대해서는 비교적 안전합니다. 물론 그는 어쨌든 세션 쿠키를 훔칠 것입니다. – Tgr

+0

@Tgr : 임의의 문자열을 사용하는 두 번째 해시가 어떻게 보안을 강화합니까? 첫 번째 해싱 (해시 암호 + 소금)이 재생 공격에 취약한 경우 두 번째 해시는 공격자가 동일한 "임의"문자열을 재생하므로 전혀 도움이되지 않습니다. –