Para un proyecto en el que estoy trabajando, necesito enviar comandos de forma segura entre servidores. Estos comandos no deberían poder modificarse, y debería haber cierta seguridad acerca de no poder seguir reenviando la solicitud.
Esto es lo que he encontrado:
public static function encryptCommand($command) {
$time = microtime(true);
$command .= ':' . $time;
$encryptedCommand = Security::encrypt($command, Configure::read('key'));
$hash = Security::hash($time);
return array(
'command' => $encryptedCommand,
'hash' => $hash
);
}
public static function decryptCommand($data) {
$encryptedCommand = $data['command'];
$decryptedCommand = Security::decrypt($encryptedCommand, Configure::read('key'));
$time = substr($decryptedCommand, strrpos($decryptedCommand, ':') + 1);
if (Security::hash($time) != $data['hash']) {
throw new SecurityException('The data has been tampered with.');
}
if (microtime(true) - $time > 5) {
throw new SecurityException('Message arrived too late.');
}
return substr($decryptedCommand, 0, strrpos($decryptedCommand, ':'));
}
La idea es agregar la hora actual al comando, cifrarlo y enviarlo junto con un hash del tiempo. En el lado de recepción, puedo descifrar el comando, comparar el hash enviado con un nuevo cálculo del hash de tiempo en el comando descifrado, y verificar si no ha pasado demasiado tiempo.
¿Es este un buen enfoque, me estoy perdiendo algo? ¿Debo hacer esto de manera diferente?