문제

전에이 스레드를 읽었다면 - 내가 쓴 모든 것을 잊어 버려, 나는 그것을 썼을 때 취했을 것입니다. 나는 다시 시작했다 :

현재 사용자 입력을 확인하기 위해 일종의 알고리즘을 사용할 프로젝트를 진행하고 있습니다. 고려해야 할 세 당사자가 있습니다.

클라이언트 - 웹 페이지 탐색

회사 - 고객 요청을 처리합니다

제 3 자 회사 - 고객 메시지 처리

웹 페이지에서 우리는 클라이언트에게 제품에 대한 정보를 보여줄 것입니다. 제품에 대한 자세한 정보를 원한다면 제 3 자 회사에 연락하여 제품 코드를 진술해야합니다 (고유 한 자체는 아니지만 일반적이지 않음). 그 대가로 고객은 타사 회사로부터 웹 페이지에 입력 해야하는 다른 코드를 받게됩니다. 여기서 승인을 위해 코드를 검증합니다.

회사가 제 3 자 회사와 상호 작용하지 않았다면 최선의 방법은 최선입니다. 순수한 암호화는 너무 길다. 우리는 SMS에 의해 이것을하고 있으므로 코드는 짧아야합니다.

지금까지 내가 생각한 것 :

모든 제품에 대해 Base 16 (0-F)에서 다소 고유 한 코드를 생성합니다 (독특하거나 실제로는 중요하지 않음). 제품에 대한 추가 정보를 원하는 고객은 제품 코드를 진술하는 제 3 자 회사에 SMS를 보냅니다. 대가로 클라이언트는 동일한 코드를 수신하지만 숫자는 곱하고 (2)를 곱하고 기본 36으로 변환됩니다. 그 위에는 마지막 문자가 코드, 컨트롤 번호에 추가되어 LUHN에 대한 코드를 유효하게합니다. 기본 36의 알고리즘. 사용자는 수신 된 코드를 입력하고 회사는 제품 코드에 대해 서버 측에서 유효성을 검사합니다 (Luhn에 대한 유효성 검사, 2로 나누고 기본 16으로 다시 전환).

이것은 합리적으로 안전하고 적절하게 들리나요? 두 당사자가 메시지를 보내는 유효한 방법입니까? 두 사람이 의사 소통 할 필요가 없을 때 메시지를 보내야합니까?

편집에 대해 죄송하지만 첫 번째 게시물을 썼을 때 내 마음은 다른 곳에 있었을 것입니다.

도움이 되었습니까?

해결책 5

3 파티 회사와의 오랜 논쟁 끝에 우리는 최상의 솔루션이 고객 SMS를 저에게 전달하면 새로운 코드를 생성하고 다시 고객에게 새 SMS를 고객에게 보내는 것입니다. 내가 생성 한 코드. 내 관점에서 최적이지는 않지만 적어도 나는 내가 원하는 방식으로 할 수 있습니다.

당신의 의견에 감사드립니다.

다른 팁

나는 당신이 혼란 스럽다고 생각합니다. 예를 들어 Luhn 알고리즘을 사용하면 다시 돌아갑니다. 진실 또는 거짓 체크섬에서. 당신이 준 샘플 코드는 두 가지 값에서 해시 될 수있는 체크섬 결과 (예 : 12345)를 원한다는 것을 나타냅니다. 이 문제는 더 어려울 것입니다.

제 3자는이 값을 어떻게 창출 할 것인가? 그들이 실행할 수있는 JavaScript 코드 또는 다른 언어를 제공 하시겠습니까? 당신은 공유 비밀 키를 가질 수 없었고 그들은 그 비밀 키로 값을 대칭 적으로 암호화 할 수있게 할 수 있습니다. 당신은 그들이 알려진 값으로 암호화 한 부분을 접두사로하여 빨리 확인할 수 있습니다.

그들의 코드 :

  to_send = encrypted(shared_key, 'check' + code)

코드 :

  unencrypted = decrypt(shared_key, to_send)
  if not unencrypted.startswith('check'):
    return False # failed check

자, 다른 응용 프로그램과 응용 프로그램간에 상호 작용을 원하지 않습니다. 코드를 6 자로 제한하고 싶습니다. 내 생각은 다음과 같습니다.

  • 10자를 사용하면 무차별적인 공격이 더 어려워집니다.
  • 모든 라틴 문자와 숫자를 사용하십시오.
  • 큰 숫자 라이브러리를 사용하고 코드 (Base36 번호로 찍음)에 약간의 큰 값 (예 : 2048 Random 비트)을 곱하십시오. 그런 다음 Base36으로 변환하고 마지막 10 자리를 가져갑니다. 또는 아마도 처음 5 및 마지막 5. 또는 원래 코드에 의존하는 다른 조합 일 수도 있습니다. 나는 이것이 얼마나 암호적으로 이것이 얼마나 강력할지 모르겠지만 (아마도 많지는 않을 것입니다), 코드를 크래킹하려는 노력은 단순히 서비스 비용을 지불하는 것보다 작게 의심 할 것입니다.
  • 또는 코드를 소금 (일부 비밀 문자열을 전제) 한 다음 MD5를 계산할 수 있습니다. MD5 (또는 일부 N 문자)를 코드로 사용자에게 반환하십시오. 나는 전문가는 아니지만 암호적으로 괜찮아 야합니다. MD5 결과를 Base36으로 변환하면이 알고리즘의 강도를 높일 수 있습니다.

왜 "체크섬"? 제 3자가 당신이 그들에게 줄 작은 유틸리티를 운영 할 수 없습니까? 제 3자가 컴퓨터에서 실행하고 제품 코드를 공급하며 5 자리 결과를 키 코드로 보낼 수있는 5 자리 암호화 자만 있으면됩니다.

암호화자는 항상 동일한 입력에서 동일한 결과를 생성합니다.

그런 다음 클라이언트는 제품 코드와 키 코드를 보냅니다. 해당 암호화의 정확한 사본을 통해 제품 코드를 실행하고 그 결과를 키 코드와 비교합니다.

기본 아키텍처를 변경하지 않고도이 시스템의 보안을 향상시킬 수 있습니다.

-AL.

설명 후 편집:

나는 여전히 제품 코드와 일치하는 타사 응답이 일정 할 수 없다고 생각합니다. 그렇지 않으면 다른 사용자가 공유 할 수 있으므로 타사에 가지 않고도 응답 코드를 제공 할 수 있습니다.

제품 코드가 일정하다면 가능한 접근 방식은 타사 응답이 둘 다 코드와 사용자의 전화 번호는 귀하의 유효성도 마찬가지입니다. 이런 식으로 각 응답은 제품과 사용자 별입니다.

Luhn 알고리즘의 특정 순열은 제 생각에 그리 중요하지 않습니다. 누군가가 한 가지 변형을 해소 할 수 있다면 아마도 다른 변형을 깨뜨릴 수있을 것입니다.

원래 답변:

요컨대, Luhn 알고리즘을 사용할 수 있다고 생각합니다. 사용자에게 일회성 티켓을 제공하면 제한된 시간 동안 유효합니다.

  • 첫째, 문제를 올바르게 이해하면 제품 코드가 일정 할 수는 없습니다. 그렇지 않으면 타사가 만든 응답은 항상이 제품에 대해 동일합니다. 이는 사용자가 나중에이 코드를 다시 사용하거나 다른 사용자에게 제공 할 수 있음을 의미합니다.
  • 따라서, 귀하는 정보 요청/제품에 대한 액세스 요청에 따라 사용자에게 임의의 새 코드를 생성하고 제공해야한다고 생각합니다. 이 코드는이 제품에 제한된 기간 (요구에 따라 1 시간, 하루) 동안 유효해야합니다.
  • 제 3자가 사용자에게 보낸 응답은 사용자에게 제공 한 코드와 함께 입력 한 경우에만 유효해야합니다.
  • 유효성 검사 후이 코드는 지정된 기간이 끝날 때까지 사용할 수 없습니다.
  • 옵션으로, 나는 당신과 타사가 계산 중에 코드와 응답 쌍과 같은 현재 날짜와 같은 것을 추가 할 수 있으므로 항상 같은 쌍은 아닙니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top