client-trace
Version:
A comprehensive client-side security and telemetry library. Features device fingerprinting, bot detection, network tampering analysis, and secure transport.
52 lines (44 loc) • 1.79 kB
JavaScript
/**
* Session Integrity Token Generator
* Creates a signed token binding the session to the user, IP (hashed), and UA.
*/
/**
* Generates a session integrity token.
* @param {string} userUniqueId - Unique identifier for the user.
* @param {string} hashedIp - SHA-256 hash of the user's IP address (provided by server/caller).
* @param {string} secret - Shared secret for HMAC signing.
* @param {number} [timestampBucketSize=300000] - Time bucket size in ms (default 5 min).
* @returns {Promise<{ sessionToken: string, components: object }>}
*/
export async function generateSessionToken(userUniqueId, hashedIp, secret, timestampBucketSize = 300000) {
const userAgent = navigator.userAgent;
const timestamp = Date.now();
const timeBucket = Math.floor(timestamp / timestampBucketSize);
const components = {
userUniqueId,
hashedIp,
userAgent,
timeBucket
};
const dataToSign = JSON.stringify(components);
const encoder = new TextEncoder();
const keyData = encoder.encode(secret);
const messageData = encoder.encode(dataToSign);
const key = await crypto.subtle.importKey(
'raw',
keyData,
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);
const signature = await crypto.subtle.sign('HMAC', key, messageData);
const signatureArray = Array.from(new Uint8Array(signature));
const signatureHex = signatureArray.map(b => b.toString(16).padStart(2, '0')).join('');
// Token format: version.base64(components).signature
const componentsBase64 = btoa(dataToSign);
const sessionToken = `v1.${componentsBase64}.${signatureHex}`;
return {
sessionToken,
components
};
}