Passando la crittografia con IV come singolo array

1

Sono abbastanza nuovo in questo, quindi sono sicuro che sia stato chiesto e risposto ma non riesco a trovare una risposta chiara. Se questo è già stato risolto, per favore indicami la giusta direzione e rimuoverò questa domanda.

Ho un programma che dovrà accettare un nome utente e una password dall'utente. Questo nome utente e password sono per un altro server, ma le informazioni dovranno essere passate attorno ad alcune DLL prima di inviare la richiesta finale all'altro server. La mia preoccupazione è di passare nomi utente e password tra DLL senza crittografia, quindi ho creato un semplice set di metodi Encrypt e Decrypt usando la classe System.Security.Cryptography.CryptoStream di Microsoft.

In sostanza, vengono eseguite le seguenti operazioni.

Una stringa semplice viene inserita nel metodo di crittografia insieme alla chiave di crittografia. Questo metodo genera quindi un array casuale casuale IV (8 byte), 8 byte e la codifica dell'array di byte. IV, array casuale e crittografia vengono quindi inseriti in un singolo array di byte e trasferiti tra DLL.

L'array di byte viene ricevuto da una DLL e passato attraverso il metodo di decrittografia con la chiave di crittografia. Questo metodo acquisisce la parte IV dell'array e la parte di crittografia dell'array e ignora gli 8 byte random aggiunti (questi vengono aggiunti semplicemente per ragioni totalmente arbitrarie). La stringa viene quindi decodificata.

Ho interrotto accidentalmente l'intera sicurezza dell'utilizzo di una crittografia aggiungendo gli IV alla matrice di byte crittografata?

Dovrei usare gli 8 byte casuali come sale (solo perché li ho comunque) e passarli attraverso la crittografia? O sarebbe sufficiente rompere ulteriormente?

Si noti che non ho accesso diretto a un elenco di nomi utente o password, si tratta di un'applicazione completamente esterna. Voglio solo assicurarmi che la richiesta e lo spostamento delle coppie nome utente e password siano al sicuro sulla mia parte.

    
posta Mikey Awbrey 19.04.2017 - 18:50
fonte

1 risposta

0

Gli IV non sono segreti ed è comune passarli insieme al testo cifrato. Quella parte non è un problema. Dato che non hai detto quale minaccia ti stai difendendo, supporrò che ti preoccupi di leggere la password direttamente dalla memoria o dai dump della memoria. In tal caso potresti avere un problema diverso con il tuo approccio: stringhe.

Le stringhe in .NET sono immutable e non è possibile cancellarle dopo aver terminato con esso. Se si assegna una stringa vuota a una variabile, il vecchio valore rimarrà in memoria e si otterrà un nuovo oggetto stringa vuoto al suo posto. Anche se si crea un array di byte e lo si cripta come si è proposto, la stringa lasciata rimarrà in memoria e rimarrà in attesa finché Garbage Collector non lo cancella.

Se non controlli il modo in cui vengono ricevute le password, potrebbe essere impossibile risolverlo. È necessario assicurarsi che la password non venga mai memorizzata in una stringa. Supponiamo che tu possa risolvere questa parte. Le tue opzioni sarebbero:

  1. Puoi sempre usare gli array di byte e fare la crittografia come hai descritto ( salt non è richiesto , assicurati di mai riutilizzare la chiave / IV coppia e genera IVs casuali con strong CSPRNG) o
  2. Utilizza SecureString .

SecureString è progettato per risolvere esattamente il problema che descrivi senza la necessità di "arrotolare il tuo".

Introdurre i primitivi della crittografia in una soluzione e credere che renderà la soluzione più sicura è ingannevole. A volte la portata del problema è molto più ampia di quanto tu non creda.

    
risposta data 20.04.2017 - 10:38
fonte

Leggi altre domande sui tag