항목을 스파이더 링/크롤링하지 못하도록 브라우저에 항목 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)을 손상시킬 수 있다는 점을 제외하고는 큰 효과가 있습니다.
[형식 암호화 유지] (http://en.wikipedia.org/wiki/Format-preserving_encryption)를 확인해야합니다.소금에 대해 아무 것도 발견하지 못하는 이유는 암호화가 소금을 사용하지 않기 때문입니다. IV 나 NONCE를 사용할 수 있지만 일반적으로 소금은 키 유도 함수에 사용됩니다. –
소금에 대한 설명을 해주셔서 감사합니다. – shannon
각 응답과 관련된 비밀 정보를 기반으로 ID에 대한 비공개 작업을 간단히 수행하기 위해 동일한 결과를 얻었을 것인지 궁금합니다 (자세한 내용은 응답 및 관련 요청과 함께 암호화되어 전송 됨) 서버 세션 상태). 나는 정말로 그 숫자를 암호화 할 필요가 없었다. 따라서 ID에 XOR을 추가하거나 XOR하십시오. – shannon