2010-03-03 7 views
7

자동 증가 기본 키가있는 테이블이 있습니다. 기본 키와 연결된 이미지를 갖고 싶지만 기본 키가 노출되는 것을 원하지 않습니다.데이터베이스 ID가 흐릿 해짐

$filename = md5($primarykey + $secret_string) . '.jpg'; 

좋은 해결책이 될 : 같은 이미지 무언가를 명명시겠습니까?

충돌이있을 수 있으며 파일을 덮어 쓸 수 있다고 걱정됩니다.

물론 다른 옵션은 임의의 문자열을 생성하여 파일로 존재하지 않는지 확인하고 데이터베이스에 저장하는 것입니다.하지만 ID는 불필요한 경우 추가 데이터를 저장하지 않는 것이 좋습니다.

다른 옵션은 논리 변환 youtube url 스타일입니다. 예를 들어 1 = a 2 = b이지만 무작위 순서가 있습니다. 예를 들어 1 = x 2 = m ... 그렇지만 디코딩 될 가능성이 있습니다 ... plus md5는 아마 어떤 youtube url 함수보다 더 가벼울 것입니다.

2 백만 건이 넘는 기록을 처리하고 있으므로 충돌 가능성이있는 것은 무엇입니까? 어느 옵션을 선택하겠습니까? 아니면 더 나은 접근 방식을 생각할 수 있습니까?

+4

이미지 레코드의 기본 키가 발견되면 어떤 위험이 있습니까? ID 열이 기본 키인 경우 – jball

+0

입니다. 쉽게 오버라이드되지는 않을 것입니다. 귀하의 DB를 잡아야하고 그에 따라 처리 할 수 ​​있습니다 – Sinan

+0

중요한 현명한 보안은 아니지만 중요한 것은 사용자가 봇을 만들고 시스템을 속일 수 있기 때문입니다. – JimBo

답변

0

당신은 정말 두 가지 옵션이있다 :

  • 충돌없이
  • 당신은 일반적으로 다음과 같은 옵션을 사용할 수 있습니다

에 대한

  • 뭔가를 생성 아무런 충돌 확인하지 & 희망 뭔가 & 생성 : - 해시 - 임의로 생성 된 문자열 - A UUID

    해시 해시를 선택하는 경우 충돌이 적은 것을 선택하십시오. 또한, 해시를 할 때 왜 DB id를 모호하게하는지 고려하십시오. 평범한 숫자를 해쉬하는 사람이라면 해시를 알아내는 데 오랜 시간이 걸릴 것입니다. 소금을 절대로 사용해야합니다. 소금에 절인 해시의 장점은 빠른 생성과 충돌 가능성이 거의 없음 (작은 경우에는이를 확인할 필요가 없으므로 삽입 속도가 빠름). 단점은 적절한 구현은 SHA256 이상이 될 것이므로 길다는 것을 의미합니다. DB/인덱스 공간을 저장하려는 경우 16 진수 변환을 수행 할 수 있습니다.

    임의의 문자열 문자 세트 또는 번호 a-Z0-9의 임의의 길이로 생성 할 수 있습니다. 이것은 URI, REQUEST 데이터 등에서 사용되는 더 짧은 문자열의 "더 많은"데이터를 의미합니다.단점은 데이터베이스에 있는지 확인해야한다는 것입니다.

    AUUID 해시와 마찬가지로 생성 속도가 빠르며 충돌 가능성이 낮으며 "덜"못생긴 순수 출력으로 수정 될 수 있습니다.

    내 제안 하지 마십시오. 아주 작은 구현에서부터 시작된 매우 큰 구현에서이 문제를 처리해야했습니다. 결국 고유 한 식별자 (예 : 콘텐츠 유형 + 식별자)를 만드는 등의 "똑똑한"작업을 시작한 다음 일부 값을보기 시작하지만 규모를 처리해야합니다. 이것을 스케일링하는 것은 매우 어렵습니다. DB는 기본 키로 ID에 최적화되어 있으므로 세로로 배율을 조정하려는 경우이 키를 입력해야한다는 놀라운 생각이 있습니다. 필요한 경우 외부 클라이언트 상호 작용에만 사용하십시오.

  • -1

    기본 키의 해시를 사용하면됩니다. 충돌이있을 확률은 낮은 veeeery입니다.

    +0

    일반적으로 옳은 코드를 작성하는 것은 좋지 않습니다. 하지만 문제가 발생하기 쉬운 솔루션이있을 때 실패 할 수 있습니다 (충분한 샘플로 실패 할 수도 있음). – ThisGuy

    0

    ID를 사용하고 싶지만 ID를 표시하고 싶지 않고 충돌 위험이 적을 경우, 하나의 옵션은 ID의 해시를 사용하는 것입니다. 해시는 일관성 있고 돌이킬 수 없으며 각 사진마다 고유 한 거대한 데이터 세트 - 2 ish를 사용합니다. 귀하의 질문에 그것의 기본적인 생각을 가지고있는 것 같습니다 :

    당신은 당신이 선택한 더 나은 알고리즘을 해싱하기 위해 MD5를 사용합니다. 가급적이면 더 큰 출력을 가진 무언가. 코멘트에 대한 응답으로 다양한 기사를 감추는 것에 기반하여, SHA512 또는 유사한 것이 더 적합 할 것으로 보입니다.

    +0

    "이고 충돌을 원하지 않으며, 하나의 옵션은 ID"의 해시를 사용하는 것입니다. 나는 당신이 더 자세히 해시를 조사해야한다고 생각합니다. 해시는 충돌을 발생시킵니다. 그래서 당신이 그들을 확인해야합니다. –

    +0

    해시는 충돌하지 않아도되지만 SHA-0, MD4 및 MD5와 같은 일부는 표시되었습니다. –

    +3

    @Dana : 해시 *는 대개 충돌 할 것으로 예상됩니다. 가장 기본적인 요구 사항은 무한히 큰 입력 공간에서 유한 출력 공간으로 매핑하는 것이며 충돌은 필연적으로 충돌을 의미합니다. cryptogrpahic 해시가 가지면 안되는 것은 의도적으로 충돌을 유발하는 방법입니다. –

    2

    linear congruential generator을 사용하십시오. 값을 적절히 선택하면 매우 큰주기의 의사 임의 시퀀스가 ​​생깁니다. 충돌은 없지만이 방법은 난독 화 방법이며 실제 보안을 제공하지는 않습니다 (그러나 나는 그것이 당신이 찾고있는 것이 아님을 전제합니다).

    +0

    더 나은 보안을 원한다면 암호로 강력한 난수로 LCG의 출력을 연결할 수 있습니다. 기본적으로 $ lcg_string과 같은 것입니다. $ rand_string; 그런 식으로 LCG가 고유성을 처리하고 임의의 문자열로 인해 예측이 불가능 해집니다. (잘 알려진 공격자는 여전히 PK를 발견 할 수 있습니다) – hrnt

    0

    일반적으로 URL의 데이터베이스 ID를 모호하게하려면 ID가 암호화되어 있어야합니다. 모호한 ID는 서버가 가려진 ID에서 데이터베이스 레코드를 조회하기 위해 되돌릴 수 있어야하기 때문입니다. 가역성은 데이터베이스 id를 파일 이름에 매핑하는 경우에는 중요하지 않지만 충돌 가능성을 제거하는 간단한 패턴입니다.

    당신은 base64로 또는 16 진수 인코딩, 예를 들어, 사용하여 ASCII로 암호화 된 데이터를 변환 할 수 있습니다 :

    base64_encode(encrypt(id, secret_key)) 
    

    및 디코딩 :

    decrypt(base64_decode(id), secret_key) 
    

    (위 의사 코드, 당신은거야입니다 PHP에서 적절한 함수를 찾아야합니다.)

    암호화가 필요없는 것은 아닙니다. DES와 같은 간단한 블록 암호로 충분합니다.

    1

    제공 한 코드는 작업을 수행하는 데 적합합니다. 충돌에 대해 걱정할 필요가 없습니다. 데이터베이스에서 사용하는 정수가 없으므로 다른 md5 해시와 동일한 md5 해시가됩니다.

    당신은 정말 확인하려면 다음 여기에 litte 테스트 스크립트입니다)

    <?php 
    for($i = 0; $i < 1000000; ++$i) { 
        $hash = md5($i); 
        if(isset($x[$hash])) { die("COLLISION!"); } 
        $x[$hash] = true; 
    }  } 
    echo "All is well"; 
    

    더 복잡한 솔루션이 시간 낭비처럼 보이지만 당신이 짧은 ID를 원하는 경우에 당신이 줄 수있는 짧은 무작위로 모든 그림에 id를 생성합니다 (그리고 생성 시간에 alrealy가 사용되었는지 확인하고 케이스가 다른 경우 생성)

    0

    Base64 사용에 동의합니다. 당신은 또한 Guid를 사용할 수 있습니다. 또는 파일 이름을 테이블에 저장하십시오.

    또한 고아가 된 파일을 피하십시오.

    0

    MD5와 같은 해시 알고리즘은 고유성을 보장하지 않는 정의에 의한 해시 (해시가 유한 값 수를 생성 함)와 같은 해시와 마찬가지로 MD5와 같은 해시 알고리즘이 좋은 해결책이 아닙니다.

    원하는 것은 암호화입니다. javax.crypto.Cipher를 살펴보십시오.

    2

    내가 그렇게 충돌의 가능성이 후드는 무엇인가 만이 이상의 기록을 처리하고 생각 것인가?

    Wikipedia에 따르면, 당신은 50 %의 확률이 적어도 하나 개의 충돌을 얻을 이상 2 개 * 10^(19) 기록을해야합니다, 그래서 당신은 걱정하지 않아도 말할 것입니다.

    0

    열을 추가 할 수있는 경우 테이블에 UNIQUE 열로 GUID를 추가하고 <GUID>.jpg을 키 이름으로 사용하십시오. GUID 알고리즘은 미래에 중복을 생성해서는 안되지만 단지의 경우 UNIQUE 제약 조건이이를 catch합니다.