2011-12-20 2 views
2

웹 사이트 및 해당 헬퍼 프로그램 (사용자 컴퓨터에 설치됨)을 개발하려고합니다. 웹 사이트와 프로그램은 서로 통신을하지만 (대부분 AJAX), 다른 웹 페이지가 요청을 프로그램에 보낼 수있는 경우 보안 위험이 커집니다. 나는 사용자 컴퓨터에 설치된 내 프로그램에 사기 요청을 주입하는 것을 매우 어렵게 만드는 해결책을 찾고 싶습니다. 내 생각은 한 번만 암호를 사용하려고하지만 보안 지식이 제한되어 있으므로 생각을 묻습니다.one-time-password 알고리즘 (matematical, time based 및 action based)

function otp(seed, counter, unix_timestamp, action) 
{ 
    for(i = 0; i < counter; ++i) 
    { 
     seed = sha256(seed + i); 
    } 
    str = seed; 

    str = sha256(str + unix_timestamp/60); 
    str = sha256(str + action); 
    otp = substr(str,0,4); //Convert the first for bytes to an int. 
    return (int)otp; 
} 

그것은 다음과 같은 속성이 있어야합니다 :

나는이 한 시간 암호 알고리즘 (의사)를 내놓았다 한

  • 은 모든 OTP에 (한 번 사용할 수 있습니다 세대는 "카운터"가 증가 => 새로운 씨앗)
  • 시간마다 변경됩니다.
  • 작업 (로그인, ...)에 바인딩 된 특정 작업에 따라 다릅니다.
  • 별도로 생성하여 나중에 동기화 할 수 있습니다.

모든 요청에 ​​OTP 코드와 카운터 값이 포함되어있는 경우이 보안이 적용됩니까? 이 작업을 수행하기위한 귀하의 조언은 무엇입니까? 나는 위에서 언급 한 모든 속성을 정말로 원합니다.

미리 감사드립니다.

+0

[해시 체인] (http://en.wikipedia.org/wiki/hash_chain) 또는 [일회용 암호 생성]의 다른 표준 방법 (http : //en.wikipedia)을 사용할 수 있습니다. org/wiki/one-time_password). OTP를 생성하기위한 표준 라이브러리를 찾고 있다면 [IT 보안] (http://security.stackexchange.com/)에서 질문 할 수 있습니다. OTP를 생성하기 위해 새 라이브러리를 작성하는 경우 [암호화] (http://crypto.stackexchange.com/)에서보다 구체적인 질문을 게시 할 수 있습니다. –

답변

6

귀하의 접근 방식은 원칙적으로 합리적입니다. 그러나 해시 함수에 대한 여러 번 호출은 무의미합니다. 첫 번째 단계에서 안전하거나 전혀 그렇지 않습니다. 또한 실제로는 시드를 사용하여 요청을 실제로 인증하기 만하면됩니다 (다른 사람이 공격자가 될 수있는 것으로 알려짐). 시드 생성의 약점은 인증의 약점이됩니다.

SHA256의 구체적인 단점을 알지 못합니다. 그러나 문제는 일반적으로 매우 일반적이며 표준 용어로 설명하고 해결하는 것이 훨씬 쉽습니다. 프로그램에 대한 요청을 인증하려고합니다. 원격 프로그램은 요청의 신뢰성을 안전하게 결정해야합니다. 이 문제는 공개 키 암호화로 가장 쉽게 해결됩니다. 예를 들어 GnuPG 키 쌍을 만들고 웹 사이트에 개인 키를 보관하고 프로그램에 공개 키를 배포 한 다음 개인 키로 프로그램에 보내는 명령에 서명하십시오. 클라이언트 프로그램은 요청을 정상적으로 수신하고 GnuPG에 대한 단일 호출을 통해 인증을 확인하기 만하면됩니다.

4

HOTP (RFC 4226)이라는 표준이 이미 있습니다. 우리보다 더 많은 암호 경험을 가진 사람들이 조사 했으므로 바퀴를 다시 발명하는 것보다는 그것을 사용해야합니다.

귀하는 적수가 누구인지 밝히지 않았습니다. 사용자가 자신의 컴퓨터에있는 사용자 인 경우 사용자가 신경 쓰는 구성표를 손상시키지 못하도록하는 것은 사실상 불가능하다는 것을 명심해야합니다.