2012-07-28 4 views
0

항목을 스파이더 링/크롤링하지 못하도록 브라우저에 항목 ID를 전송할 방법이 필요합니다.비밀 및 공유 소금으로 정수 암호화

제 생각은 정수 ID를 비밀 및 공유 소금으로 암호화하는 것입니다. 이렇게하면 동일한 고유 항목에 대한 많은 영구적이지만 예측할 수없는 URL이 허용됩니다.

string RESULT_SET_SALT = "randomValue1"; 
foreach(ResultItem item in results) { 
    item.id = encrypt(SECRET, RESULT_SET_SALT, id); 
} 

실제로 전송 무엇 :

{ 
    1: "Item One", 
    2: "Item Two" 
} 

내가 먼저 웹 서버의 ID를 암호화 할 수 있습니다 : 나는 맑은 레코드 1의 결과와 2보다는 전송 ID를 전송해야하는 가정

클라이언트 상세보고 항목을 선택
{ 
    RESULT_SET_SALT: "randomValue1", 
    387439: "Item One", 
    79: "Item Two" 
} 

는 AJAX 요청 염 및 암호 값을 포함한다 : 클라이언트 염 및 암호화 된 값이다.

$.get("/ItemDetails/387439?RESULT_SET_SALT=randomValue1"); 

서버에서 ID는 요청에 포함 된 클라이언트를 SECRET 및 SALT를 사용하여 해독합니다.

int actualRequestedId = decrypt(387439, "randomValue1", SECRET); // result is 1 

이 유익 : Simple integer encryption 그리고이 : Way to encrypt a single int

염을 사용하는 방법에 대한 어느 문서 회담. 아마도 비밀을 두 부분으로 나누어 그 중 절반을 전송한다면 아무도 그것을 해독하려고하지 않을 것입니다. 그러나 알고리즘의 남용 유형이 종종이를 깨뜨리고 올바르게 처리하기를 원합니다. .

어떤 권장 사항이 있습니까? ID를 int로 유지할 필요는 없지만 큰 일괄 처리를 전송하고이를 작게 유지해야합니다. 다수의 ID가 있고 암호화 프로세스가 결과 UI를 차단하므로 너무 비싸지 않아야합니다. 이 기본 .NET (C#) 암호화를 활용하면 좋을 것입니다.

EDIT : 다른 ID (높은 대역폭)는 각 ID에 임의의 32 비트를 임의로 추가하는 방식입니다 소금을 사용하기보다는 비밀로 암호화하십시오. 이것은 알고리즘의 또 다른 남용이기 때문에 똑같은 ID에서 여러 번의 반복을 생성하는 사용자의 능력이 비밀 (또는 덜 중요하게는 개별 ID)을 손상시킬 수 있다는 점을 제외하고는 큰 효과가 있습니다.

+0

[형식 암호화 유지] (http://en.wikipedia.org/wiki/Format-preserving_encryption)를 확인해야합니다.소금에 대해 아무 것도 발견하지 못하는 이유는 암호화가 소금을 사용하지 않기 때문입니다. IV 나 NONCE를 사용할 수 있지만 일반적으로 소금은 키 유도 함수에 사용됩니다. –

+0

소금에 대한 설명을 해주셔서 감사합니다. – shannon

+0

각 응답과 관련된 비밀 정보를 기반으로 ID에 대한 비공개 작업을 간단히 수행하기 위해 동일한 결과를 얻었을 것인지 궁금합니다 (자세한 내용은 응답 및 관련 요청과 함께 암호화되어 전송 됨) 서버 세션 상태). 나는 정말로 그 숫자를 암호화 할 필요가 없었다. 따라서 ID에 XOR을 추가하거나 XOR하십시오. – shannon

답변

1

암호화를 유지하는 형식이 아마도 당신이 찾고있는 것이지만 구현하기 쉽지 않습니다. 서버의 세션에 연결된 임의의 키를 사용할 수 있습니다. 공격자는 단순히 모든 값을 요청할 수는 있지만 추측 할 수는 없습니다.

CTR 암호는 모든 값을 암호화하고 동일한 크기 (비트 단위)를 반환 할 수 있습니다. 그것들은 (API에서) 더 나은 가용성을 가지고 있지만, 그들은 같은 키로 각 ​​암호화에 대해 NONCE를 요구한다.

또는 서버에 테이블을 유지하고 항목 ID에 임의의 ID를 기억할 수도 있습니다. 그렇게하면 공격자는 단순히 서버를 통해 제출 된 항목 만 검색 할 수 있습니다. 이것은 다른 솔루션보다 훨씬 쉬울 수 있지만 테이블을위한 추가 메모리가 필요합니다 (당연히).

다른 링크에서 제출 된 답변 외에도.

+0

서버 세션 키에서 임의의 키 아이디어가 마음에 들지만 마음에 들지 않습니다. 지금까지는 세션을 완전히 피할 수있었습니다 (클라이언트 연결 상태 없음). 나는 각 응답에 대해 무작위 대칭 키를 암호화/전송한다고 가정합니다. 내가 촬영 한 또 다른 기능은 고유 항목에 대한 URL의 고유성이 아니라는 것입니다 (detail/987343 및 detail/12392는 동일한 항목을 반환 할 수 있음). 평문에서 소금을 분리하는 것은 이것을 제공하지 않는다는 것을 알고 있습니다 ... 당신이 말했듯이 모든 암호화 된 ID를 반복합니다. 대부분이 존재하지 않기 때문에, 실제로는 일일 할당량이이를 무효화합니다. – shannon

+0

또한, 임의 ID에 대한 ID의 메모리 맵을 갖는 것이 서버에서 더 많은 메모리가되지는 않습니다. 즉, 맵이 내 데이터베이스에 유지되거나 서버 또는 응용 프로그램이 다시 시작될 때 유효하지 않을 수 있습니다. 내 건축물이 진짜 제약 일지 모르지만 나는 여전히 귀하의 답변을 처리하고 있으며 아마도 그것을 받아 들일 것입니다. 나는 semi-persistent item URL을 전자 메일로 보내기위한 별도의 메커니즘을 가질 수 있다고 가정하고 만료일을 갖습니다. – shannon

+0

도움을 주셔서 감사합니다.이 답변을 수락하고 다른 관점에서 질문을 게시하고 있습니다. – shannon

관련 문제