2012-12-30 4 views
9

나는 PHP 5.4에서 사이트를 개발 중이며 암호 보안을 위해 임의의 소금을 사용하는 것이 더 나은지 궁금하다.urandom 또는 openssl_random_pseudo_bytes를 사용해야합니까?

$salt = sha1(openssl_random_pseudo_bytes(23)); 

또는

$seed = ''; 
$a = @fopen('/dev/urandom','rb'); 
$seed .= @fread($a,23); 
$salt = sha1(seed); 

또는 난 그냥 함께 가야한다 : 보안을 위해

$salt = openssl_random_pseudo_bytes(40); 

또는

$salt = ''; 
$a = @fopen('/dev/urandom','rb'); 
$salt .= @fread($a,23); 
+4

sha1()을 사용하면 40 문자이고 0-9 및 a-f 문자 만 포함하는 문자열로 변환되므로 무작위 소금 효과가 크게 감소합니다. –

+0

두 제안을 모두 사용하려고합니다. – John

답변

10

당신이 openssl_random_pseudo_bytes를 사용하는 것이 더 낫다. OpenSSL은 좋은 임의성을 제공하기에 충분한 엔트로피를 수집합니다. /dev/urandom으로 고쳐지지 않으므로 블록이되며 임의의 바이트가 아닌 속임수로 제공 될 수 있습니다.

임의의 바이트를 사용하면 SHA1을 통해 실행할 필요가 없습니다. 모든 합계를

는 수행 실제로

$salt = openssl_random_pseudo_bytes(40, $cstrong); 
if (! $cstrong) { 
    exit('This should not happen'); 
} 
+1

사실,'openssl_rand_pseudo_bytes'는 더 이상 임의의 진실성을 보장하지 않습니다. (더 적은 랜덤을 의미합니다) '/ dev/urandom'보다; 그 이름의 '의사'가 의미하는 것입니다. 그러나 실제로는 두 가지 방법 모두 알려진 방법으로 무작위와 구별 할 수없는 출력을 생성합니다. –

+0

@IlmariKaronen 물론 진정한 임의성을 얻지는 못합니다. 나는 "좋은"이라고 썼다. OpenSSL이 "암호 학적으로 강하다고"말한 것. 그래서 결과가 암호 학적으로 강하다는 것을 테스트에 넣었습니다. – kmkaplan

+1

[OpenSSL을 사용하지 마십시오] (https://github.com/ramsey/uuid/issues/80). –

9

은 거의 확실하게 차이가 없다.

openssl_random_pseudo_bytes/dev/urandom 모두는 의사 난수 바이트의 암호로 안전한 소스를 제공합니다. 어느 누구도 무작위로 보장되지는 않지만 실제로는 알려진 또는 예측 가능한 기술로 인해 모두 실제 무작위성과 구별 할 수 없을 것으로 예상됩니다.

의 "/디바이스/urandom을 장치로부터 판독 더 기다리고 차단할 것이다

Kmkaplan는 man unrandom에 명시된 바와 같이 /dev/urandom는, 특정 조건 하에서 이론적으로 예측 결과를 반환 할 수 있음을 주목 기술적으로 정확 결과적으로 엔트로피 풀에 엔트로피가 충분하지 않으면 반환 값은 이론적으로 드라이버가 사용하는 알고리즘에 대한 암호화 공격에 취약합니다.이를 수행하는 방법에 대한 지식은 현재의 분류되지 않은 문헌에서는 사용할 수 없습니다. 이론적으로 그러한 공격이 존재할 가능성이 있습니다. 응용 프로그램에서 이것이 우려되는 경우 n 대신 /dev/random을 사용하십시오. "

"RAND_pseudo_bytes()는 의사 - 랜덤 바이트 BUF로 NUM을두고 다음 OpenSSL documentation에 명시된 바와 같이

그러나, 동일 (내부적으로 OpenSSL 함수 RAND_pseudo_bytescalls) openssl_random_pseudo_bytes 실제로 사실RAND_pseudo_bytes()에 의해 생성 된 의사 랜덤 바이트 시퀀스는 길이가 충분하지만 반드시 예측할 필요는 없지만 고유하지 않습니다. 비 암호화 용도 및 특정 목적으로 울 때 사용할 수 있습니다 ptographic 프로토콜이지만 일반적으로 키 생성 등에는 사용되지 않습니다."

는 이러한 경고의 둘은 아마도 같은 부팅이 직후없는 하드웨어 RNG와 디스크가없는 임베디드 장치에 특정 인위적인 상황 (제외하고, 이론에만있는 설명 약점을 이러한 방법 —를 사용에서 당신을 놀라게 실제로해야 PHP가 정상적으로 전개되는 상황에서 실질적인 문제가되어서는 안됩니다.

결론적으로이 난수 생성 방법은 암호 시스템에서 the weakest link이 아니므로 둘 중 하나를 안전하게 선택할 수 있습니다. 편집증 환자라면 둘 다 사용할 수 있습니다.


Ps. openssl_random_pseudo_bytes의 장점 중 하나는 Windows에서도 작동한다는 것입니다. 한편, /dev/urandom은 OpenSSL PHP 확장이 설치되어 있지 않더라도 Unix에서 사용할 수 있습니다. 따라서 최대의 이식성을 위해 실제로 두 가지 모두에 대한 지원을 구현해야합니다.

또한 항상 예상 한만큼 많은 바이트를 수신했는지 확인하십시오. 예를 들어 위 질문에 /dev/urandom 기반 코드는 Windows와 같은 시스템에서 빈 문자열을 자동으로 반환 할 수 있습니다. /dev/urandom이없는 경우입니다.

+0

'RAND_pseudo_bytes'와'openssl_random_pseudo_bytes'는 "생성 된 바이트가 암호 학적으로 강건한 지"를 알려주는 코드를 반환합니다. – kmkaplan

관련 문제