2013-04-21 4 views
0

클라이언트를 서버 점수 및 기타 암호화 할 정보에 보내려면 게임 응용 프로그램을 만들고 싶습니다.Mcrypt와 PHP를 사용하여 HTTP GET 매개 변수의 공개/개인 키 암호화로 재생 공격 방지

공개 키와 비공개 키를 사용하여 데이터를 암호화하는 방법이 있다는 것을 알고 있습니다. mcrypt 그래서 클라이언트 측의 응용 프로그램은 암호화 될 것이지만 그것을 해독 할 수있는 유일한 사람입니다. 계속할 정보가별로 없기 때문에 데이터를 붙여 넣을 수있는 가장 안전한 방법을 알고 싶습니다. 지금까지 이해 무엇

이 예는 다음과 같습니다

나는 경우 : msgencrypted=fgus9g8uywe978ygt7923y5235sdfdsadfsd (예)

만 내 서버에있는 특정 키 : ?username=foo&score=50&msg=hello
내가 그것을 암호화 할 수 있습니다 나는 해독 할 수있다.

다시 말해 나는 사용자로부터 데이터를 숨기는 가장 좋은 방법을 찾으려고 노력 중이므로 암호를 해독 할 수 없게됩니다.

즉, 메시지를 암호화하면 ... 해당 메시지를 두 번 보낼 수 없습니다.

그래서 사용자가 방화 광을 사용하여 요청을 보았고 다시 보내려하면 메시지가 유효하지 않습니다. 데이터베이스에 기록 할 수있을 것 같아요. 그러나 그런 일에 대한 방법이 있다면 그것은 좋을 것입니다.

PHP 5.4를 사용하고 있습니다.

+0

이것은 재생 공격이라고 할 수 있습니다. 지금까지의 용어에 대해 잘 모르는 경우가 있으므로 다시 검색하십시오. – hakre

답변

0

PKI (public key infrastructure)을 사용해야합니다. 공개 키 암호화 (일명 비대칭 암호화)는 두 개의 개별 키 (키 쌍)를 필요로하는 암호화 알고리즘을 말하며, 그 중 하나는 비밀 (또는 개인)이고 그 중 하나는 공개 키입니다.

클라이언트가 공개 키에 액세스 할 수 있고 공개 키를 사용하여 메시지를 암호화하고 개인 키에 액세스 할 수있는 서버 만 메시지를 해독 할 수 있습니다. RSA 알고리즘을 사용하여 점수 및 기타 정보를 암호화하여 서버로 보낼 수 있다고 가정 해 봅니다. 이렇게하면 parameter-tampering을 막을 수 있습니다. 또한 변조를 방지하기 위해 MAC (Message Authentication Code)을 사용할 수도 있습니다.

하지만 GET 대신 POST 데이터를 사용하는 것이 좋습니다. 일반적으로 URL은 웹 서버 또는 ISP에 로그인되기 때문입니다. 따라서 쿼리 문자열에 기밀로 암호화 된 데이터를 저장하지 않는 것이 좋습니다.

재생 공격을 방지하기 위해 카운터를 사용하여 매개 변수를 따라 보낼 수 있습니다. 서버 측에서는 마지막 카운터 값 (예 : 123)을 저장합니다. 카운터 값이 저장된 값과 같거나 작은 요청을 받으면 요청을 거부해야합니다. 예 : 카운터 값이 < = 123 인 요청을 받으면 모든 매개 변수를 암호화하므로 아무도 카운터 값을 변경하지 못할 수 있습니다.

사실 POS 단말기는 재생 공격을 막기 위해 비슷한 접근 방식을 사용합니다. 보다 높은 수준의 보안을 원할 경우 POS 트랜잭션 보안 및 재생/중간자 공격으로부터 트랜잭션을 보호하는 방법에 대해 읽어보십시오.