想象一下,我有一個用Java實現的網頁,可在http://mycompany.com/page1.xhtml?trafficSource=someTrafficSourceIdentifier&checkSum=...
處獲得。如何驗證URL參數沒有被篡改?
我想跟蹤不同流量來源(如不同的廣告系列)生成的網頁訪問量。爲此,我有trafficSource
參數。該組流量來源ID被限制爲5個可能的值(例如Google有機,Google AdWords,YouTube,Facebook,Twitter)。
想象一下,我想確保trafficSource
沒有被篡改(沒有人給它放過不同的值)。爲此,我介紹checkSum
參數。
什麼是爲字符串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;
}
}
如果問題所在的值不是這5個值之一,那麼只做字符串比較會更快。如果問題是人們僞造哪個站點,那麼問題是不可能的,因爲他們可以從他們正在模擬的任何站點複製checkSum。 – Vitruvius
我無法創建一個密鑰(只有我知道),然後使用該密鑰爲每個有效的字符串創建校驗和?然後,當有人更改'trafficSource'參數時,他或她將無法生成正確的'checkSum',因爲只有我擁有密鑰。有沒有簡單的方法來做到這一點? –
如果您可以說服Google,Facebook和Twitter創建特殊的PHP來重新計算您的鏈接,以便在每次向用戶提供當前時間和共享密碼時加入散列,當然。 – Vitruvius