2011-01-21 3 views
3

이 질문은 교육 목적으로 만 사용됩니다. 지금은 인증 메커니즘을 포함하고자하는 작은 애플리케이션을 만들고 있습니다. 응용 프로그램은 인터넷이 설치되어 있어야 액세스 할 수 있어야하지만 이후에는 오프라인으로 작업 할 수 있어야합니다. 지금까지 다음 솔루션을 생각해 보았습니다.델파이 - 인증 메커니즘 제안

1) Classic : 사용자 이름과 암호 (암호화 된)가 인증 웹 서비스로 전송 됨 - 인터넷 연결이 끊어졌을 때 문제가 발생합니다.
2) 마더 보드/하드 디스크 직렬 번호를 기반으로 암호를 생성합니다. 구성 요소가 변경되면 문제가 발생합니다.

또한 '비밀번호 기억'확인란을 포함하고 싶습니다. 가장 안전한 방법은 무엇입니까? 이 정보는 어디에서 보관해야합니까?

저는 여러분 대부분이 인증 메커니즘을 만들었거나 다소 복잡하다고 생각하며 여러분의 의견을 묻습니다. 또한 모든 것을 해킹 할 수 있지만 가능한 한 어렵게 만들고 싶습니다.

+0

귀하의 질문에 답할 수 있는지 확실하지 않습니다. 단일 서버 요청 - 응답이 받아 들여지고 로컬에서 해시를 저장하면 충분히 잘 작동한다는 것을 알 수 있지만 그게 전부입니다. –

답변

5

는 바퀴를 재발견하지 마십시오 ... 진짜 PWD를 얻을 않은 해시 할 수없는 로컬 해시를 절약 할 수 있습니다!

몇 가지 규칙 :

  • 인증은 사용자 당해야합니다;
  • 인증은 세션, 즉 네트워크 연결 및 특정 시간에 대한 인증이어야합니다.
  • 은 암호를 디스크에 명확하게 저장하지 않지만 해시를 사용합니다.
  • 은 네트워크를 통해 절대 암호를 전송하지 않지만 해시를 사용합니다.
  • 임의의 값의 해시 중 일부 '소금'(즉 임의의 데이터)을 추가합니다.
  • Zero-knowledge proof 일종의 시도를 시도하십시오.

간단히하기 위해 서버는 클라이언트에 "챌린지"를 만듭니다.

일반적인 구현 될 수 있습니다

  1. 클라이언트는 사용자 이름을 말하고, 서버에 연결;
  2. 서버가 이름을 확인한 다음 클라이언트에 대한 챌린지를 만들어 보내십시오.
  3. 클라이언트는 사용자에게 암호를 입력하도록 요청한 다음이를 사용하여 요청에 응답합니다.
  4. 서버가 응답을받은 다음 문제가 올바른지 확인하십시오.
당신은 좋은 해싱 알고리즘 ( our very fast SHA-256 functions에서보세요)를 사용하여 문제를 작성하고 다음 단계를 수행 할 수

:

  • 사용자가 초기 암호를 입력은 다음 SHA-256로 전송된다 서버 (고정 된 개인 키를 통해 암호화 됨).
  • 서버는 사용자 이름/암호 해시를 키/값으로 저장합니다.
  • 서버는 임의의 블록을 생성하여 챌린지를 생성합니다 (현재 시간과 기타 무작위 데이터 + 무작위 값을 포함한 임의의 데이터의 SHA-256 사용).
  • 클라이언트는 사용자가 입력 한 암호의 해시로 서버로부터받은 임의의 블록을 해시합니다.
  • 서버는 클라이언트에서 결과를 수신하고 사용자의 저장된 암호 해시를 사용하여 자체 버전을 계산 한 다음 두 값을 비교합니다. 두 값이 같으면 시도가 성공합니다.
+0

매우 흥미로운 접근! +1. 하지만, 사용자가 항상 인터넷에 연결되어 있지 않다면? 사용자는 예를 들어 앱을 5 번 사용하고 있으며 그 중 5 명 중 2 명이 연결되어 있습니다. – RBA

+0

잘 Radu, 분명히 대답, 당신은 일부 원격 서버 또는 서비스에 대해 인증하는 것으로 가정합니다. 정확히 무엇에 대해 인증하고 있습니까? 지역 및 원격 당국에 대한 일종의 하이브리드 인증을위한 설계 및 계획이 있습니까? Windows에서 작동하는 NT/XP/W7 도메인 로그인과 같은 서류 가방 모델이 필요합니까? –

+0

로컬 인증의 경우 클라이언트 소프트웨어가 사용자 이름/암호 해시의 개인 복사본을 키/값으로 만들 수 있으며 사용자가 입력 한 값의 해시를 비교할 수 있습니다. SHA-256을 사용하면 같은 텍스트에 대해 두 개의 일치 항목을 찾을 수 없습니다. 사용자 이름은 SHA-256으로 저장 될 수 있으며 전체 키/값 콘텐츠는 AES-256으로 암호화됩니다. –

3

달성하고자하는 바에 달려 있습니다. 예를 들어 서버에서 중요한 데이터를 먼저 검색 한 다음 login-password로 암호화하여 항상 로컬에 저장할 수 있습니다. 이렇게하면 암호가 PC에 저장되지 않으므로 암호를 입력해야만 데이터에 액세스 할 수 있습니다.

+0

+1. 이것이 내가 원하는 것입니다. A.Bouchez에게 회신 한 내용도 참조하십시오. – RBA

2

쿠키를 사용하여 암호화 된 파일에 암호를 저장하거나 더 나은 방법으로 데이터베이스에 저장하는 브라우저를 수행 할 수 있습니다. 사용자가 서버에서 암호를 변경 한 경우 데이터베이스 암호를 업데이트해야한다는 점을 기억하십시오. 암호를 생성 할 필요가 없습니다. 사용자에게 그렇게하도록 요청하고 복잡성을 검사하여 안전한지 확인하십시오. 웹 서비스에 연결할 때 항상 SSL을 사용하여 모든 데이터가 안전하게 전송되는지 확인하십시오.

+1

+1은 SSL 아이디어입니다. – RBA

+2

나는 여기에서 말한 것에 대부분 동의하지 않는다. 암호 저장은 암호화되지 않았거나 암호화되지 않은 좋은 방법은 아닙니다. 암호 해시를 저장하는 것이 좋으며, 일부 소금을 추가하는 것이 더 바람직합니다. 나는 '더 나은 암호를 데이터베이스에 저장'하지 않습니다. 데이터베이스에 대한 특별한 점은 무엇입니까? 더 편리 할 수도 있지만 더 좋을까요? '당신은 암호를 생성 할 필요가 없습니다. '란 무엇인가 : 세계에서 누가 암호를 생성 할 것인가? –

+0

나는 암호 저장이 좋은 생각이라고 말하지 않았다. 나는 그가 할 수 있다고 말했다. 그리고 만약 그렇게한다면 우연히 또는 사용자가 그것을 잃어 버리지 않기 때문에 데이터베이스에 저장하는 것이 더 좋습니다. 그리고 나는 그가 예의를 가지고 있었기 때문에 그가 암호를 생성 할 필요가 없다고 말했다. 물론 아무도 그렇게하지 않을 것입니다. –

3

잘 암호를 기억하기위한, 당신은