2010-06-22 4 views
3

세션 해시에 사용할 올바른 알고리즘을 선택할 때 크기가 중요합니다.세션 해시가 중요합니까?

최근에 나는 article을 읽었으며 월풀을 사용하여 세션 ID에 대한 해시를 만드는 것이 좋습니다. 월풀은 128 문자 해시 문자열을 생성합니다. 너무 큽니까?

계획은 세션 해시를 db에 저장하는 것입니다. 64 문자 필드 (sha256), 96 문자 필드 (sha384) 또는 128 문자 필드 (소용돌이)를 사용하는 데 많은 차이가 있습니까? 소용돌이에 대한 초기 주장 중 하나는 속도 대 다른 알고리즘 이었지만 속도 결과를 보면 sha384가 너무 나쁘지는 않습니다.

해시를 잘라내어 128 자보다 작게 만드는 옵션이 있습니다.

원래 코드 스 니펫을 수정하여 필요에 따라 알고리즘을 변경할 수있게했습니다.

업데이트 : 문자열이 해시되는 것에 대한 토론이 있었기 때문에 코드를 포함 시켰습니다.


function generateUniqueId($maxLength = null) { 
    $entropy = ''; 

    // try ssl first 
    if (function_exists('openssl_random_pseudo_bytes')) { 
     $entropy = openssl_random_pseudo_bytes(64, $strong); 
     // skip ssl since it wasn't using the strong algo 
     if($strong !== true) { 
      $entropy = ''; 
     } 
    } 

    // add some basic mt_rand/uniqid combo 
    $entropy .= uniqid(mt_rand(), true); 

    // try to read from the windows RNG 
    if (class_exists('COM')) { 
     try { 
      $com = new COM('CAPICOM.Utilities.1'); 
      $entropy .= base64_decode($com->GetRandom(64, 0)); 
     } catch (Exception $ex) { 
     } 
    } 

    // try to read from the unix RNG 
    if (is_readable('/dev/urandom')) { 
     $h = fopen('/dev/urandom', 'rb'); 
     $entropy .= fread($h, 64); 
     fclose($h); 
    } 

    // create hash 
    $hash = hash('whirlpool', $entropy); 
    // truncate hash if max length imposed 
    if ($maxLength) { 
     return substr($hash, 0, $maxLength); 
    } 
    return $hash; 
} 
+2

그녀가 당신에게 말한 것에 관계없이, 크기는 중요합니다! 심각하게도,이 모든 것들은 오늘날의 저장 매체에 비해 매우 작습니다. 세션 수가 많으면 (수백만) 더 긴 해쉬가 충돌을 덜 만듭니다. 그러나 그것은 이미 매우 큽니다. *, ** 매우 ** 어쨌든 가능성은 희박합니다. –

+0

나는 그녀가 나를 응원하려하고 있다고 생각했지만, 나는 백만 세션을 처리 할 것으로 기대하지 않는다. 내 주요 관심사는 인덱싱과 DBMS가 이러한 큰 char 필드를 처리하는 방법입니다. – Andre

답변

3

해시를 만드는 데 걸리는 시간은 중요하지 않으며 데이터베이스가 적절히 색인화되어있는 한 저장소 방법도 중요한 요소가 아니어야합니다.

그러나 해시는 항상 쿠키로 클라이언트의 요청과 함께 전송되어야합니다. 큰 쿠키는 각 요청에 약간의 추가 시간을 추가 할 수 있습니다. 자세한 내용은 Yahoo!'s page performance best practices을 참조하십시오. 쿠키가 작을수록 해시가 작아 지므로 이점이 있습니다.

전반적으로 큰 해시 함수는 아마도 정당화되지 않습니다. 제한된 범위에서, 좋은 옛날 md5와 sha1은 세션 토큰 뒤에있는 소스로서 아마 괜찮을 것이다.

+0

저장된 해시는 몇 시간에서 몇 주까지 지속될 수 있습니다. 한 번에 토큰을 사용하려면 더 작은 해시가 사용됩니다. – Andre

+0

* 세션 * 해시가 수 주 동안 지속되면 GC가 손상되거나 미친 사용자가있는 것입니다. 엣지 케이스. – Charles

+0

해시는 사용자 환경 설정이 db에 저장되어 24 시간 만료가있는 쿠키에 저장된 해시에 연결되기 때문에 중단 될 수 있습니다. 일반적으로 쿠키는 마지막 21 일 후에 만료되도록 설정되지만 방문. 이 기간 동안 수천 명의 사용자가 사이트를 방문했을 수 있습니다. 그런데 세션을 참조 할 때 나는 브라우저가 닫힐 때 일반적으로 만료되는 PHP에 의해 설정된 세션을 말하는 것이 아닙니다. 나는 이것이 어떤 혼란을 없애기를 희망한다. – Andre

0

SHA1 또는 MD5로 충분할 수 있습니다. 실제로, 충돌의 확률은 너무 낮아 결코 일어나지 않을 것입니다.

결국 궁극적으로 필요한 보안 수준에 따라 다릅니다. 긴 해시는 계산하기가 더 비싸고 저장 공간이 더 많이 필요하다는 점을 명심하십시오.

1

기사를 읽으려고 할 때 시간이 초과되지만 세션 식별자로 해시를 사용하는 데는 충분한 이유가 없다고 생각합니다. 세션 식별자는 예측할 수 없어야합니다. 기사의 제목이 주어지면 저자는 그 원리를 인정하는 것처럼 들립니다. 그런 다음 암호화 식별자를 생성하기 위해 암호화 난수 생성기를 사용하지 않는 이유는 무엇입니까?

해시는 입력을 받아 들일 수 있으며 입력이 예측 가능한 경우 해시도 마찬가지입니다.

+0

해시 입력 생성 방법에 대한 코드를 포함하도록 원래 게시물을 업데이트했습니다. – Andre

2

예, 크기가 중요합니다.

너무 짧으면 충돌 위험이 있습니다. 또한 공격자가 무차별 공격으로 다른 사람의 세션을 찾는 것이 현실적입니다.

너무 오래 걸리지는 않지만 모든 요청마다 세션 ID의 모든 바이트를 브라우저에서 서버로 전송해야하므로 실제로 작업을 최적화하는 경우 ID가 너무 길어서는 안됩니다.

해시 알고리즘의 모든 비트를 사용할 필요는 없습니다. Whirlpool과 같은 것을 사용하지 못하도록 막은 다음 처음 128 비트 (16 진수는 32 문자) 만 사용합니다.실질적으로 말하면, 128 비트는 길이에 대한 좋은 하한이기도합니다.

에릭슨 (Erickson)이 지적했듯이, 해시를 사용하는 것은 조금 이상합니다. 적어도 사용하는 ID의 길이만큼 엔트로피를 입력하지 않는 한 해시에 대한 입력을 추측하는 공격에 취약합니다.

+0

처음 32 자만 가져 가면 md5를 사용하는 것이 합리적이지 않습니까? 왜냐하면 첫 번째 32 자의 가능성있는 후드가 해시의 수에 관계없이 동일한 수의 후드가 md5보다 높기 때문에 월풀 해시를 잘라내지 않으면 충돌의 기회가 증가하기 때문입니다. 이 가정은 md5가 월풀 해시의 128 자와 반대로 32 자의 16 진수를 기본적으로 생성하기 때문에 발생합니다. 나는이 점에서 완전히 벗어날 수 있습니다. – Andre

+1

해시에는 '약점'이라는 두 가지 별개의 원인이 있습니다. 해시 자체의 구성이 있고 해쉬의 길이가 있습니다. MD5는 첫 번째 카운트에서 반복적으로 손상되었지만 128 비트는 무차별 대입 (brute-force)으로 충돌을 찾을 수 없도록 충분히 큰 검색 공간으로 남아 있습니다. 보안 해시의 경우 임의의 하위 집합을 가져올 수 있으며 같은 길이의 다른 하위 집합과 마찬가지로 양호합니다. 큰 해시의 하위 문자열이 짧은 해시의 전체 출력보다 약한 경우 해당 해시가 부분적으로 예측 가능하기 때문에 더 큰 해시가 손상되었음을 의미합니다. –

+0

삭제 해 주셔서 감사합니다. – Andre

관련 문제