createTimeBasedHMAC static method
Crea un HMAC basado en tiempo usando el contenido del body y una clave secreta
Params:
- body: El mapa que se serializará a JSON
- key: La clave secreta para la generación del HMAC
Returns: String con el HMAC generado
Implementation
static String createTimeBasedHMAC(
{required Object body,
required String key,
required String timeToSync,
required String validityInSeconds}) {
logDebug(
'createTimeBasedHMAC ==> body => $body, key => $key, timeToSync => $timeToSync');
if (key.isEmpty) {
throw ArgumentError('La clave HMAC no puede estar vacía');
}
try {
final timeSlot =
_getCurrentTimeSlot(int.tryParse(timeToSync) ?? 0, validityInSeconds);
// Usar un separador distintivo para evitar colisiones
// final bodyString = '${jsonEncode(body)}$timeSlot';
final bodyString100 =
('$body'.length > 100) ? '$body'.substring(0, 100) : '$body';
final bodyString = '$bodyString100$timeSlot';
final hmac = Hmac(sha256, utf8.encode(key));
final digest = hmac.convert(utf8.encode(bodyString));
logDebug(
'createTimeBasedHMAC ==> .. timeSlot => $bodyString100 $timeSlot .. bodyString => $bodyString .. digest => $digest');
return '$digest';
} catch (e) {
if (e is JsonUnsupportedObjectError) {
throw ArgumentError(
'El body contiene objetos que no se pueden serializar a JSON');
}
rethrow; // Propagar otros errores
}
}