Per un progetto su cui sto lavorando, ho bisogno di inviare comandi in modo sicuro tra i server. Questi comandi non dovrebbero essere alterati e ci dovrebbe essere un po 'di sicurezza per non essere in grado di continuare a inviare nuovamente la richiesta.
Questo è quello che mi è venuto in mente:
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, ':'));
}
L'idea è di aggiungere l'ora corrente al comando, crittografarlo e inviarlo insieme con un hash del tempo. Dal lato ricevente, posso decodificare il comando, confrontare l'hash inviato con un nuovo calcolo dell'hash tempo nel comando decrittografato e controllare se non è passato troppo tempo.
È un buon approccio, mi manchi qualcosa? Dovrei farlo diversamente?