해싱에 사용하기 위해 무작위로 긴 소금을 생성하는 방법?

StackOverflow https://stackoverflow.com/questions/2235434

  •  19-09-2019
  •  | 
  •  

문제

PHP에서 해싱에 사용하기 위해 임의의 가변 길이 소금을 만드는 방법은 무엇입니까? 16자가 긴 소금을 만들고 싶다고 가정 해 봅시다. 어떻게 하시겠습니까?

올바른 솔루션이 없습니다

다른 팁

편집 : McRypt Extension은 더 이상 사용되지 않았습니다. 새로운 프로젝트를 위해 살펴보십시오
random_bytes (int $ length)
그리고 나트륨 (PHP 7.2 Core-) 확장.


만약 McRypt 확장 간단히 사용할 수 있습니다 mcrypt_create_iv (크기, 소스) 소금을 만듭니다.

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);

"문자열"의 각 바이트는 0-255 사이의 범위에있을 수 있으므로 저장/검색하려면 이진 안전 함수가 필요합니다.

OS에 따라 다음과 같은 것입니다.

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

무작위와 urandom의 행동에 대해 읽으십시오.

다른 사람들은 MD5와 반복 해싱에 일부 문제가 있음을 올바르게 지적했지만, 암호 (예 : 상대적으로 짧은 문자열) 무차별 공격은 해싱 알고리즘이 얼마나 정교한 지에 관계없이 같은 시간이 걸립니다.

씨.

다음은 임의의 문자열을 생성하는 함수를 찾았습니다.

/* random string */
function rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ rand( 0, $size - 1 ) ];
    }
    return $str;
}

좋은 소금에 대한 두 가지 전제 조건이 있습니다. 길고 무작위 여야합니다. 이것을 달성하는 방법에는 여러 가지가 있습니다. 당신은 조합을 사용할 수 있습니다 microtime 그리고 rand, 예를 들어, 소금이 독특하다고 보장하기 위해 더 많은 길이로 갈 수 있습니다.

충돌의 가능성은 무시할 수 있지만, 소금을 MD5 또는 기타 충돌이 발생하기 쉬운 알고리즘으로 소금 해싱하면 소금이 독특 할 가능성이 줄어들 것입니다.

편집 : 대체 rand() ~을 위한 mt_rand(). 마이클이 지적했듯이, 그것은보다 낫습니다 rand.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top