SQL Server에서 UNIQUEIDENTIFIER를 안전하게 생성


15

나는를 사용하려는 UNIQUEIDENTIFIER사용자가 특정 데이터에 액세스하는 데 사용할 수있는 액세스 키로. 그런 의미에서 키는 암호 역할을합니다.

INSERT...SELECT명령문의 일부로 여러 식별자를 생성해야 합니다. 아키텍처상의 이유로이 경우 서버 측에서 식별자를 생성하려고합니다.

안전하게 무작위로 생성하려면 어떻게 UNIQUEIDENTIFIER해야합니까? 참고, 즉 NEWID이 전혀 보안 속성을 약속하지 않는 한 임의 충분하지 않을 것입니다. 이해할 수없는 ID가 필요하기 때문에 System.Security.Cryptography.RandomNumberGenerator 와 동등한 SQL Server를 찾고 있습니다. 뭐든지 기반으로 CHECKSUM, RANDGETUTCDATE또한 자격을하지 않을 것입니다.


2
최소한 @AaronBertrand는 숫자가 항상 인 경우 하나 4입니다. 그러나 그들이 추측 할 수 있다는 강력한 증거가 없다고해서 그렇지 않다는 것을 의미하지는 않습니다. 이 보안 결정은이 관찰에 근거 할 수 없습니다.
usr

1
어쩌면 NEWID는 "데비안 약한 SSH 키"랜덤이되는 것처럼 : en.wikinews.org/wiki/... 그들은 확실히 그들을 테스트 개발자 ... 랜덤 보았다
USR

2
이 4는 GUID 생성에 사용되는 알고리즘을 알려줍니다. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mr.Mindor

1
보안 수준의 유일한 결정 요소는 비트 엔트로피라는 것을 알고 있습니까? NEWID가 사용자의 요구에 맞게 임의적이지 않다는 아이디어는 사용 사례에서 "안전"해야하는 비트 엔트로피의 양에 대한 아이디어가 있음을 의미합니다. 그 숫자는 무엇입니까?
Cade Roux

2
@usr- "내부 상태에 대한 충분한 지식"은 어떤 접근 방식 이든 깨뜨릴 수 있습니다 .

답변:


26
SELECT CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER)

내가 생각했던 트릭을해야합니다.

CRYPT_GEN_RANDOM

CAPI (Crypto API)에서 생성 한 암호화 난수를 반환합니다.


4

내 두 센트지만 좋은 생각이 아닐 수도 있습니다. GUID의 (에릭 Lippert의의 우수한 시리즈 의역 1 부 , 2 부 , 3 부 글로벌 고유 식별자, 글로벌 고유 식별자를 고정하지 -)의 약어 GUID하지 GSUID입니다.

문제는 NEWID ()를 사용하는 모든 사람과 같이 적대적이지 않은 범위 내에서 GUID가 생성 될 때 모든 값이 고유 한 것으로 보장된다는 것입니다 (잘, 종류, Eric의 기사, 파트 3 참조). 그러나 적대적인 개체가 해당 범위에 들어가면 다음에 생성 된 GUID를 예측하고 자체적으로 충돌을 일으킬 수 있습니다.

GUID처럼 보이는 구조 내부에 저장하는 값을 생성하는 고유 한 방법을 만들면 본질적으로 적대적인 실체가됩니다. 당신은 인에서 GUID의 계약을 변경 한 독특한 존재로 임의 . 내가 당신을 여전히 독창적이라고 증명할 수있는 것보다 수학을 잘하는 사람이 있지만, 그것은 당신의 세대 방법의 범위 안에 있습니다. 이 의사 GUIID와 NEWID () GUID를 혼합하면 모든 베팅이 해제됩니다.

나는이 말을 할 수 있습니다 난 당신이 값을 사용하는 방법의 전체 범위를 모르는 때문 좋은 생각하지. 값을 생성하는 유일한 엔터티 (혼합 및 일치 없음) 및 / 또는 값을 유지하지 않거나 충돌에 신경 쓰지 않으면 문제가되지 않을 수 있습니다. 해당 항목 중 하나라도 사실이 아닌 경우 재평가를 원할 수 있습니다.


흥미로운 점. 내 데이터 유형 선택 UNIQUEIDENTIFIER은 대부분 우연의 일치입니다. 해당 유형을 사용하여 16 바이트 수량을 처리하는 것이 편리합니다. 암호로 생각합니다. 하지만 고유해야합니다. 나는 충돌을 결코 보지 못할 것이라고 확신한다 (그리고 앱이 있더라도 충돌 할 것이므로 안전하다).
usr

동의하지 않습니다. 유일한 것이 아니라 무작위가되면 암호화하는 방법에 달려 있습니다. 쉽게 동일 할 수 있습니다.
Dawesi

4

https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ 에 따르면 NEWID () 함수는 Windows 함수 CoCreateGuid를 래핑하여 v4 스타일 GUID를 반환합니다. . https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 에 따르면 1999 년 Windows 2000부터

"Windows에 빌드 된 모든 버전 4 GUID의 임의 비트는 Windows CryptGenRandom 암호화 API 또는 암호화 키 생성에 사용되는 동등한 소스를 통해 얻습니다."

따라서 적어도 122 비트 엔트로피의 범위까지 NEWID ()를 암호로 안전하다고 생각할 수 있습니다.


그 흥미 롭군요. 나는 개인적으로 보안상의 이유로 이것을 신뢰하지 않을 것입니다. Windows 나 SQL Server는 이에 대해 보증하지 않습니다.
usr

@ usr 보증이 어떻게 생겼는지 잘 모르겠습니다. "보증인"이라는 단어는 사용하지 않지만 표준 MSDN Windows SDK 설명서 인 것으로 보입니다. MS가 향후 일부 Windows 버전에서 GUID의 암호화 임의성을 다운 그레이드 할 가능성은 거의 없습니다. 얻을 것이 없습니다.
Jordan Rieger

이 MSDN 페이지는 단순히 역사적 선택을 문서화하지만 앞으로도 계속 유지 될 것이라고는 말하지 않습니다. SQL Server와 동일합니다. 나는 이것이 붕괴 될 상황을 상상할 수 없다. 그러나 치명적인 RNG 디바 클이 많이있었습니다. 이와 같은 가정은 종종 거짓으로 판명되었습니다. 휴리스틱 논쟁입니다.
usr

@usr 그러나 MSDN 설명서 는 Windows의 향후 동작을 어떻게 보장 할 수 있습니까? 이 경우에 우리가 기대할 수있는 것은 현재 행동에 대한 문서입니다. 동작이 변경되면 문서를 업데이트하십시오. 그렇기 때문에 이러한 스택 오버플로 Q & A에는 버전 태그가 있으며 수시로 업데이트됩니다.
Jordan Rieger

그들은 변하지 않을 것들에 대해 보증합니다. 제품을 변경할 수는 있지만 "이러한 속성에 보안 상 중요한 기능이 있습니다"라고 말하면 그렇지 않습니다. 나는 문제의 문서가 미래에 대한 진술보다 역사적인 견해와 비슷하다고 해석합니다.
usr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.