2011-03-09 2 views
3

나는 nonce 생성과 PHP에 관해 여러 가지 질문을했지만 nonce의 "한 번"측면을 관리하는 것에 대한 논의는 발견하지 못했습니다.Apache/PHP에서 Nonce 관리하기

여기 내 상황입니다.

webservice에 액세스해야하는 일부 PHP가 있고 webservice에 요청하면 nonce를 생성하고 요청에 서명하기 위해 PHP가 필요합니다 (예 : webservice에서 nonce를 요청하지 않음). 그 부분은 쉽습니다.

여러 세션이 계속 될 수있는 경우 nonce 재사용을 방지하기위한 좋은 해결책으로 고심하고 있습니다.

내가보기에 내가 할 수있는 세 가지가 있습니다.

하나는 데이터베이스에 nonce/timestamp 쌍을 저장 한 다음 데이터베이스에서 기존의 nonce를 확인하고 오래된 것을 만료하는 등의 논리를 구현하는 것입니다. 스레드 안전을 위해 TRANSACTION 또는이 필요합니다. 왝.

둘째, nonces를 APC에 저장하고 (내 경우에는 memcached를 사용할 수 없음) TTL이 만료되도록하십시오. 이 경우 스레드 안전성은 로직을 sem_acquire()/sem_release()에 랩핑해야하며 그렇지 않으면 apc_add()은 정말로 thread-safe입니까? 캐시가 꽉 찼기 때문에 apc_add() 또는 apc_store()이 실제로 실패하면 상황을 처리하는 방법이 내 관심사입니다.

3 가지가 APC 대신 Cache_Lite를 사용하는 것입니다.

다른 옵션이 있습니까? 내가 말할 수있는 한, OpenID는 Non_Lace를 Cache_Lite로 관리하므로, 이것이 최선의 해결책이라고 생각하지만 커밋하기 전에 모든 옵션을 점검하고 싶다.

감사합니다.

답변

7

하나는 데이터베이스에 nonce/timestamp 쌍을 저장 한 다음 데이터베이스에서 기존의 nonce를 확인하고 오래된 값을 만료시키는 등의 논리를 구현하는 것입니다. 또한 스레드에 TRANSACTION 또는 LOCK TABLE이 필요합니다. 안전. 왝.

테이블 잠금없이이를 수행 할 수 있습니다. 사용중인 데이터 저장소가 ACID compliant 인 경우 모든 노력이 도움이 될 것입니다. 이것은 MySQL을 사용하고 있다면 InnoDB 테이블을 사용한다는 것을 의미한다.

nonce, 생성 시간, 최대 수명 및 소비 시간 필드가있는 테이블을 만듭니다. nonce를 기본 키 또는 고유 키로 만듭니다. nonce를 할당하려면 테이블에 삽입하십시오. 중복 키 오류가 발생하거나 트랜잭션을 사용하여 교착 상태 또는 유사한 문제가 발생하면이를 catch하고 새 nonce를 생성하십시오.

an adequate randomness generator like openssl_random_pseudo_bytes을 사용 중이며 nonce에 충분한 바이트를 수집하는 경우 충돌 가능성이 매우 낮습니다.

nonce를 소비로 표시해야하는 경우 nonce 행 에 대한 간단한 UPDATE를 수행하고 사용 된 열이 null이어야 함을 요구합니다. 업데이트는 수정 된 행 수를 반환합니다 (트랜잭션을 사용하는 경우 교착 상태). 수정 된 행 수가 0이거나 교착 상태가 발생하면 다른 것으로 이미 nonce를 소비로 표시하고 사용자에게 적절한 오류를 반환 할 수 있습니다.

이런 종류의 난센스를 처리하기 위해서는 적절한 데이터베이스 엔진이 입니다. 바퀴를 재발 명하지 마십시오.

+0

감사합니다. 이 접근법은 나에게 발생하지 않았다. – mpdonadio

+0

'date_consumed'를'DATETIME' 또는'TIMESTAMP'로 사용 하시겠습니까? – binnyb

관련 문제