Представьте, что у меня есть веб-страница, реализованная на Java, которая доступна по адресу http://mycompany.com/page1.xhtml?trafficSource=someTrafficSourceIdentifier&checkSum=...
Я хочу отслеживать, сколько посещений страниц генерируется разными источниками трафика (например, различные рекламные кампании). Для этой цели у меня есть параметр trafficSource
. Набор идентификаторов источника трафика ограничен 5 возможными значениями (например, Google organic, Google AdWords, YouTube, Facebook, Twitter).
Представьте себе, я хочу убедиться, что trafficSource
не был подделан (никто не разместил там другое значение). С этой целью я checkSum
параметр checkSum
.
checkSum = f(X)
простой способ создать контрольную сумму для строки X (checkSum = f(X)
), так что разные входные строки преобразуются в разные контрольные суммы?
Целью этой меры является базовая проверка моих параметров.
Я попытался использовать следующее, но он создает массив байтов с не буквенно-цифровыми символами, которые я не могу поместить в URL.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class CheckSumGenerator {
public String calculateCheckSum(final String aInput) throws NoSuchAlgorithmException {
final MessageDigest md = MessageDigest.getInstance("SHA");
final byte[] checkSumBytes = md.digest(aInput.getBytes());
final String result = new String(checkSumBytes);
return result;
}
}
Вы можете получить реферер на стороне сервера из заголовка http-запроса, который не отображается пользователю. Это может идентифицировать посетителей, поступающих с youtube или facebook.
Чтобы решить вашу проблему преобразования хэша в буквенно-цифровую строку, вы можете преобразовать полученные байты в шестнадцатеричный код.
final String result = DatatypeConverter.printHexBinary(checkSumBytes);
trafficSource
параметрtrafficSource
, он или она не сможет сгенерировать правильнуюcheckSum
потому что только у меня есть ключ. Есть ли простые способы сделать это?