2011-11-19 1 views
1

본문을 검색하기 전에 SO와 found this answer은 본질적으로 GUID가 예측 가능하므로 무작위로 사용해서는 안됩니다. 그러나 내 이해에서 나는 의견이 맞지 않는다. 그러나이 질문은 GUID squicing에 관한 것입니다.로그인 키로 사용할 64 비트에 대한 GUID 위험 부담이 있습니까?

제 생각에 GUID는 부분 MAC 주소, 시간 및 난수로 구성됩니다. 나는 GUID의 어떤 부분이 무엇인지 모르지만,이 함수는 근본적으로 2 64 비트 int와 XOR을 함께 사용한다. 나는 현재 1) 비밀번호를 재설정하려는 사람들을위한 리셋 키로 결과를 사용합니다. 2) 로그인 키. 로그인 할 때 db와 쿠키의 키를 설정합니다. 사이트를 방문 할 때마다 쿠키가 사용자 ID 및 loginkey와 데이터베이스가 일치하는지 확인합니다.

안전한가요? 나에게 그것은 충분히 무작위로 느껴진다. 바이트는 물건을 암호화하는 데 사용되지 않습니다. 사람이 100milliseconds에 로그인했을 때 의심 스러울지라도 (네트워크 연결을 통해 확인하는 것을 잊지 마십시오. 직접 DB를 확인하지 않아도됩니다. 이미 값을 볼 수 있습니다)

이 사용에 문제가 있습니까?

public static Int64 GuidInt64(bool noZero=true) 
{ 
    Int64 randNum; 
    do 
    { 
     var g = Guid.NewGuid(); 
     var buf = g.ToByteArray(); 
     var l0 = BitConverter.ToInt64(buf, 0); 
     var l1 = BitConverter.ToInt64(buf, 8); 
     randNum = l0^l1; 
    } while (noZero && randNum == 0); 
    return randNum; 
} 

답변

3

"충분히 안전함"은 상대적이며, 보호 할 데이터의 민감도와 공격의 가능성에 따라 다릅니다.

금융 시스템에서 의심 스러울 지 모르겠지만 StackOverflow와 같은 사이트에서는 민감한 데이터가 많지 않거나 도난당한 신원 (명성을 제외한 휴지통)으로 처리 할 수없는 사이트는 안전하다고 말하고 싶습니다. 충분히.

위험은 모두 낮추고 위험을 적절히 완화합니다.

그렇다면 좋은 암호화 알고리즘을 사용하면 사용자 이름과 암호 또는 다른 유사한 보안 키를 저장하는 데 단방향 해시를 사용하는 것이 좋습니다.

1

왜 GUID를 사용하고 있습니까?

using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider()) 
{ 
    byte[] inBytes = new byte[4]; 
    rng.GetBytes(inBytes); 
    return BitConverter.ToInt64(inBytes,0); 
} 

생성 된 값을 수락하기 전에 충돌을 검사 할 수도 있습니다.

+0

내가 멀티 스레딩 시스템 및 system.random에 대해 안전하다고 들었 기 때문에 GUID를 사용했습니다. 그래서 나는 시스템을 잠 갔어. 랜덤. 두 개의 CPU 코어에서 두 개의 난수 생성기가 동일한 난수를 가질 수 있다는 사실을 기억합니다. 솔루션에 문제가 있습니까? 어쩌면 내가 정적 함수와 하나의 System.Security.Cryptography.RNGCryptoServiceProvider하고 그것에 대한 액세스를 잠글 수 있어야합니까? –

+0

MSDN 문서에 따라 RNGCryptoServiceProvider는 스레드로부터 안전합니다. – Yaur

+0

멋지다, 이건 내가 사용할거야.하지만 내가이 특정 질문에 대한 대답을 받아 들일 지 모른다면. –