2009-11-26 3 views
5

ASP .Net MVC 응용 프로그램을 개발 중입니다. 내 행동 중 하나는 매개 변수로 id이 필요합니다. 예를 들어 당신이 볼 수 있듯이GUID를 ID로 사용하기

public actionresult Detail(Guid id){ 
    return View(); 
} 

, 나는 Guid 대신 Int을 사용하고 있습니다. 이 문제는 더 미적이다. URL은 매우 길 수 있습니다 (예 : localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2).

Guid의 일부만을 localhost/Detail/0c157b42과 같이 사용하는 것이 안전합니까?

답변

4

GUID는 고유 한 것으로 의도되었지만 일부는 아닙니다. 자세한 내용은 this blog post을 참조하십시오. SHA-1 또는 (보안 문제가없는 경우) MD5와 같이 GUID를 단축해야 할 경우 해시를 잘 처리하십시오. 용도에 따라

+0

? 즉, 문제의 예제가 유효한 경우 36 자의 GUID를 가져오고 32 자로 __shorten__ 할 것입니다.(__if__을 사용하면 32 문자가되고 SHA1은 48 문자가됩니다.) – pihentagy

+0

@pihentagy : 요점은 해시 처리 후 해시 작업에 참여할 수 있지만 충분히 랜덤하지만 GUID 자체에 참여할 수 없습니다. – sharptooth

3

아니요, 안전하지 않습니다.

SHA-2 해시를 계산할 수 있으며 그 중 처음 몇 글자 만 가져올 수 있습니다.

+0

고유하지 않을 것입니다! – pihentagy

+0

GUID의 하위 문자열보다 더 고유하며 임의의 숫자보다 더 고유 할 수 있습니다. – Spongeboy

2

아니요, 일부 GUID가 고유하지 않을 가능성이 있으므로 전체 GUID가 필요합니다. 예를 들어

:

0c157b42-379d-41d5-b9ba-83e9df9985b2

0c157b42-379d-41d5-b9ba-83e9df9985b3

공지 사항, 마지막 번호가 다릅니다. 시작은 모두 같습니다. GUID의 마지막 부분은 사용할 수 없습니다. GUID의 생성 부분이 변경 될 때이를 예측할 방법이 없기 때문입니다.

-2

늦은 응답의 비트하지만 경우에 사람이를 읽고 ...

, 당신은 단축 GUID 값을 제공 할 수 있습니다.

예를 들어, ID 값이 생성되어 사용자에게 인증 토큰 종류 값으로 제공되면 생성하는 동안 많은 문자를 사용하여 다른 값과 비교할 수 있습니다. 일치하는 항목이 있으면 새 항목을 생성하고 고유 한 항목까지 다시 비교하십시오.

또한이 기술은 GUID의 해시 값을 너무 작게 조정하면 안전합니다. 실제로 ID로 사용할 값을 무작위로 생성 할 때마다 '이미 사용 중'이 아닌지 확인해야합니다.

+0

경합 상황의 위험 때문에 "사용 중이 아닌지 확인하십시오"에 대한 조언을 권합니다. 이렇게하면 다른 스레드가 동시에 같은 ID를 생성 할 경우에 대비하여 데이터베이스를 잠글 필요가 있음을 의미합니다. 전체 GUID를 만들거나 DB의 책임하에 ID 생성을 푸는 것이 훨씬 좋습니다 (예 : 자동 증분 Int) – Spongeboy

0

고려해야 할 다른 옵션 - * GUID가 두 개 이상인 경우 0c157b42, URL localhost/Detail/0c157b42에 적용 가능한 Details 개체 목록을 표시하십시오. * URL 별칭 - Details 개체의 "Friendly URL"필드를 허용합니다.

0

-s의 GUID를 지우고 HEX를 16 자로 줄이는 Base32 (A-Z, 0-5)로 변환 할 수 있습니다.

+0

GUID는 128 비트 정수입니다. Base32는 문자 당 32 개의 값으로, '2^5', 5 비트입니다. guid를 완전하게 표현하려면'128/5 = 25.6' 문자가 필요합니다. Base64는'128/6 = 21.3'으로 짧을 것입니다. 분수 성분은 패딩 (padding)에 의해 식별되므로,이를 보상하기 위해 두 개의 노치 (notches)를 붙여야합니다. – Travis