2013-06-30 3 views
2

PHP에서 이것을 수행하는 방법을 알고 있으며 최근에이 코드를 발견했습니다. 나는 JS에 매우 익숙하다. 누군가이 코드의 기능과 구현 방법을 설명 할 수 있습니까? 근본적으로 내가해야 할 일은 내가 만들고있는 사이트에 대해 공정하고 도박적인 경험을하는 것입니다.자바 스크립트 암호화 기능 - 어떻게 작동합니까?

PHP 관련 예제 (필자와 관련된 모든 것) : 나는 rand()를 암호화하고 내기 전에 롤백 된 암호화 된 버전을 제공하고이를 client_seed에 추가합니다. 사용자는 client_seed를 변경할 수 있습니다. 그들은 59.73이라는 숫자를 얻은 후 client_seed와 함께 암호화 된 버전을 추가하여 내기가 제공되기 전에 제공되는 해시가 공정하게 제공되는지 확인합니다.

JS와 PHP가 아닌 JS에서 모든 것을 가지고 있기 때문에이 코드를 구현할 수있는 방법을 이해할 수 없다는 것을 제외하고는.

감사합니다.

<script type="text/javascript"> 
function lucky_number(server_seed, client_seed, nonce) { 
var hex_chars_to_use = 5; 
var hash = crypto.createHmac('sha512', server_seed).update(client_seed + ':' + nonce.toString()).digest('hex'); 
var len = hash.length; 

for (var i = 0; i < len; i += hex_chars_to_use) { 
    var hex = hash.substring(i, i + hex_chars_to_use); 
    var lucky = parseInt(hex, 16); 
    if (lucky < 1000000) 
     return lucky; 
} 

// the 26th substring will always be <4096 (3 hex digits), so we won't get here 
util.log(0, 'RAN OUT OF HASH! using ' + hash + ' - returning', 0); 
return 0; 
}; 
</script> 

답변

0

우선 인터넷에있는 코드를 사용하십시오. 종종 잘 테스트되거나 맞지 않습니다. 예를 들어, 결국 코드는 0을 반환합니다. 하지만 그 전에 돌아 오는 이상한 기회가있는 것 같습니다. 그러면 발신자에 따라 달라집니다 - nonce이 증가하고 다음 값이 계산된다고 가정 할 수 있습니다. 그러나 결과에서 숫자 0이 사라집니다!

이 코드는 효율성이 떨어지며 lucky이 될 가능성은 테스트되는 번호 (1000000)에 따라 다릅니다. 이제 그 번호는 괜찮은 것 같습니다. 예를 들어 숫자 2을 넣으면 어떻게 될까요? 코드는 그다지 실행되지 않을 것이고 기본적으로 내일은 없기 때문에 임의의 값을 버립니다.

서버 시드가 필요한 이유는 JavaScript 내에서 임의적으로 사용할 수 있기 때문입니다. 일반적으로 JavaScript가 브라우저에 배포 된 경우 사용할 수있는 진정한 무작위 소스는 없습니다. 진정한 randoms을 원한다면 은 서버에서 오는입니다. 이 시드를 대체 할 쉬운 방법은 없습니다. 당신이 할 수있는 최선의 방법은 사용자 입력으로부터 무작위 소스를 생성하는 것인데, 까다 롭고 충분히 랜덤하지 않을 수도 있습니다.

사용자에게 서버에서 생성 된 임의의 시드를 제공하는 또 다른 이유는 사용자가 속이지 않는지 확인하는 것입니다. 서버에서 클라이언트와 서버 시드 (그리고 nonce의 시작 값이지만 0 일 수도 있음)를 알면 전체 임의 스트림을 다시 생성 할 수 있습니다. 이는 클라이언트가 임의의 의미있는 방식으로 임의의 스트림에 영향을 줄 수는 없지만, randoms은 여전히 ​​클라이언트에서 생성 된 시드에 종속되어 있으므로 서버가 속일 수는 없음을 의미합니다. 불행히도 클라이언트와 서버 모두 게임 자체를 변경할 수있는 힘을 가지고 있기 때문에 이점이 있는지 여부는 의심 스럽습니다.

+0

그래서 어떤 코스를 택할 것입니까? 내가 작성한 PHP에서 코드가 잘 작동하지만 내 문제는 그들이 롤을 클릭하면 페이지를 새로 고칩니다. 나는 그것이 롤업 승/O를 새로 고치고 다음 균형을 업데이 트 싶어요 (그들은 .001 그리고 내기 .0001 난 그것이 자동으로 .0009로 업데이 트하려는 경우 그것은 손실 또는 .0011 이기면). 이 작업을 수행하기 위해 어떤 JS를 사용해야합니까? – user2534566

+1

매우 도움이되지 않는 대답은 진행하기 전에 보안 프로토콜을 만드는 것입니다. 이 코드는 초기 문제가 아니며 문제는 문제 공간을 이해하지 못하고 문제를 해결할 수있는 솔루션을 이해하지 못하는 것입니다. 우선 프로토콜을 개발하고 검증해야합니다 (유스 케이스로 시작한 다음 디자인, 디자인 주변의 스레드 모델 등으로 시작). 이해할 수 있듯이, 이것은 Stackoverflow를 뛰어 넘으며 많은 함정이 있습니다. –

+0

그런 다음 클라이언트가 로컬에서 충분히 랜덤 한 랜덤을 단순히 생성하는 버전을 만들고자한다면 요청간에 PRNG의 상태를 저장해야합니다. 이것은 안전한 프로토콜을 만들지는 않지만 귀하의 상황에 충분할 수 있습니다. –

1

우선이 스 니펫은 <script> 그 자체에 속하지 않습니다. 실제로는 node.js 환경에서 서버 측에 속하는 함수입니다. 기능을 보면

, 어떤 사용은 서버 측 씨는 좋은 것 모든이 후 을 클라이언트는에 액세스 할 수 있습니다 (이 소스에 있다면 그가 원하는 경우, 클라이언트 는, 그것에 액세스 할 수 있습니다.) 경우 사용자 행동에 결과를 창출하는 것입니다. 그가 그것에 접근 할 수 있다면, 그는 느슨하게 할 것인지, 아니면 이기고 그에 따라 내기를 조정할 것인지를 알 수 있습니다. 이 사이트는 몇 분 안에 파산하게됩니다.

crypto 개체는 node.js.에 포함 된 기본 모듈입니다.See the crypto.createHmac function in the docs.

이 부분이 조금이라도 좋았 으면 좋겠습니다.

관련 문제