Frage

Angenommen

, dass wir zwei Anwendungen haben:

MasterApp

SlaveApp

MasterApp ausführt SlaveApp mit einigen Argumenten, zB: slaveapp --param1 100 param2 "hello"

Sie können nicht direkt sehen, aber jemand kann versuchen, Argumente zu slaveapp zur Verfügung gestellt zu inspizieren, und führen Sie es von der Konsole.

Ich mag slaveapp ausführbar werden nur durch masterapp, so dass Benutzer sie nicht im Konsolenmodus ausgeführt werden können (oder als Slave oder eine andere app). Ich dachte an etwas unique_string und md5(unique_string + salt) bieten, aber wenn jemand Argumente inspizieren wird, kann er verstehen, was goin' auf. Gibt es eine Möglichkeit, es zu tun nur durch einig einzigartiges, vertrautes Argument bereitstellt, die nicht zweimal verwendet werden kann (und es gibt keine gemeinsame Nutzung von Ressourcen wie Dateien mit privaten / öffentlichen Schlüsseln usw.)?

War es hilfreich?

Lösung

Es ist im Grunde unmöglich, Replay-Attacken zu vermeiden, wenn Ihr einzigen Kommunikationskanal Master geht -> Slave. Wenn Sie sich die Anforderung mit einem Zeitstempel in es könnte helfen, aber selbst das ist nicht perfekt (vor allem, wenn der Angreifer eine gewisse Kontrolle der Uhr hat).

Die bessere Strategie ist es, eine Zwei-Wege-Kommunikation zwischen Master und Slave zu etablieren. Ich bin nicht sicher, welche Sprache Sie arbeiten in, aber in der Regel ist es eine Möglichkeit, für den Master zu reden an den Slave, nachdem es, andere als nur die Befehlszeile gegabelt.

diesen Kanal verwenden, können Sie die Slave eine zufällige Nonce generieren senden, dass an den Master, der Meister Zeichen es haben, schicken Sie es zurück an den Slave, und überprüfen Sie die Unterschrift in den Slave.

Andere Tipps

Wie wäre es nur die Paramater mit einem vordefinierten Verschlüsselungsschlüssel übergeben Verschlüsselung und einschließlich eines check_string eines Typs (das heißt EPOCH Zeit). Dann dekodieren die Paramater in salveapp und überprüfen Sie die check_string (in diesem Beispiel, dass EPOCH Zeit) in einem bestimmten Bereich oder ein bestimmte Wert.

Hier ist ein einfaches Ruby-Beispiel, seine in einer einzigen Datei, so dass Sie es zu Händels Befehlszeilenargumenten ect ändern müßten.

require 'openssl'
require 'digest/sha1'
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.encrypt
# your pass is what is used to encrypt/decrypt
c.key = key = Digest::SHA1.hexdigest("1094whfiubf9qwer8y32908u3209fn2032")
c.iv = iv = c.random_iv
e = c.update("#{Time.now.to_i}")
e << c.final
puts "encrypted: #{e}\n"


#sleep(15) #if you uncomment this the validation will fail.
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.decrypt
c.key = key
c.iv = iv
d = c.update(e)
d << c.final
if(Time.now.to_i - d.to_i < 10)
    puts "decrypted: #{d}\n"
    puts "Validated EPOCH Time"
else
    puts "Validation FAILED."
end

Stellen Sie sicher, dass die Slave-App wird von demselben Benutzer die Master-App läuft wie ein Unternehmen und stellen Sie sicher, dass es nicht für alle lesbar oder ausführbare Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top