2012-05-15 16 views
9

Qualcuno può mettere a riposo la mente e vedere se questa configurazione verificherà che un file proviene da me. Un'idea di quanto è sicuro questo sarebbe grande e qualsiasi potenziale vettore di attacco.Firma DSA protetta

  1. Creare una chiave pubblica e privata con DSACryptoServiceProvider.
  2. Aggiungi chiave pubblica come risorsa applicazione
  3. Creare un aggiornamento
  4. Ottenere DSA hash di aggiornamento utilizzando chiave privata
  5. Invia hash e aggiornamento per l'applicazione (Presume questi possono essere intercettato/cambiata)
  6. verifica hash è correggere usando la chiave pubblica.
  7. se verificato applicare l'aggiornamento

L'aggiornamento è un exe e verrà eseguito in modo che voglio fare in modo che non è eseguita se qualcuno sostituisce o manomette esso.

MODIFICA: aggiornato il punto 6 in quanto la chiave pubblica non genera effettivamente un hash, ma lo verifica. Penso che sia questa parte che sto lottando con la sicurezza di.

+2

Questo è esattamente l'algoritmo corretto, tranne che non si _hash_ con la propria chiave privata; si genera un hash e quindi si _cripta l'hash_ con la propria chiave privata. Il destinatario utilizza la chiave _public_ per decrittografare e verificare l'hash. Suppongo anche che la tua chiave privata risieda su un supporto isolato (una chiave USB o un computer non in rete). :-) La tua chiave privata deve essere tenuta segreta, ma tutti gli altri componenti (l'aggiornamento, l'hash e la tua chiave pubblica) non devono essere tenuti al sicuro. –

+0

Grazie Adam, solo un paio di punti penso che mi manchi. Come posso ottenere l'hash da DSACryptoProvider senza la chiave privata? Ho pensato hash = DSACryptoServiceProvider.fromxmlstring (privatekey) .signdata (fileToGetHashFrom) - Secondo punto. Non pensavo di poter crittografare i dati con DSA, dovrei usare qualcos'altro? Inoltre, non criptare normalmente i dati con una chiave pubblica e decrittografarli con una chiave privata. La mia chiave è la direzione sbagliata in quel caso? Scusa se sono stupido qui ;-) – Oli

+2

@Oli la creazione di firme digitali è spesso descritta come un processo in 2 fasi che consiste di 1) generare un hash dei dati da firmare, quindi 2) trasformare l'hash * usando * il chiave privata, in modo che possa essere verificata utilizzando la chiave pubblica e non possa essere falsificata. La natura unidirezionale del processo di generazione/verifica presenta somiglianze con la crittografia/decrittografia, utilizzando solo le chiavi pubbliche e private "al contrario". 'DSACryptoServiceProvider' si prenderà cura di tutti questi dettagli esattamente nel modo in cui hai commentato, ma penso che il punto di Adam sia che la chiave privata non è usata per generare l'hash. – shambulator

risposta

1

Il tuo approccio sembra buono. La domanda rimanente è quanto è sicura la tua applicazione sul client. C'è una possibilità che qualcuno possa manomettere l'eseguibile? Forse passare la chiave pubblica nella risorsa dell'applicazione?

Qui è teorico, ma suggerisco una piccola modifica al passaggio 6: specifica quale chiave pubblica esatta desideri utilizzare. Se un utente malintenzionato potrebbe cambiare la chiave nella risorsa dell'applicazione, potrebbe inviare un pacchetto modificato con un hash corretto per un'altra chiave privata. Questa potrebbe essere una preoccupazione minore poiché l'utente malintenzionato ha già modificato il tuo software. Ma se solo fosse in grado di sostituire la risorsa dell'applicazione e nient'altro avrebbe allora la possibilità di consentire all'applicazione di aggiornarsi con il suo codice maligno.

Problemi correlati