Domanda

Stiamo sviluppando un servizio che accetterà una richiesta POST . Alcuni dei dati POST dovranno essere crittografati prima del POST poiché verranno archiviati in campi nascosti in un modulo.

L'applicazione è scritta in C #, ma vogliamo che i client di terze parti possano integrarsi facilmente con essa. Scopriamo che la maggior parte dei client utilizza PHP, ASP classico o VB.Net.

Le terze parti dovrebbero solo eseguire la crittografia. Faremmo la decrittazione. Non esiste una comunicazione bidirezionale.

Quali sono le combinazioni più compatibili di algoritmo di crittografia, modalità padding e altre opzioni?

È stato utile?

Soluzione

Supponendo di avere un modo sicuro di condividere una chiave (che si tratti di crittografia RSA, recupero tramite un collegamento SSH o HTTPS o chiamata dell'altro sviluppatore su una linea telefonica protetta), una qualsiasi delle principali crittografie moderne (come AES , come indicato da @Ed Haber) sarebbe adatto. Vorrei secondo il suo suggerimento di AES. Dovrebbero esserci librerie per PHP, VB, Ruby, ecc.

Tuttavia, ricorda che con " nessuna comunicazione a due vie " dovrai trovare un metodo fuori dal canale per ottenere in modo sicuro la chiave simmetrica per la parte crittografica.

Altri suggerimenti

Se intendi che per le terze parti dovrebbe essere impossibile decodificare i dati, allora vorrai utilizzare un algoritmo di crittografia asimmetrica come RSA. Ciò consentirà a terzi di crittografare i dati con la tua chiave pubblica e quindi solo tu puoi decrittografare i dati con la tua chiave privata, che non divulgherai. Dovrebbero essere disponibili implementazioni di RSA per tutte le lingue menzionate.

Se non ti interessa se le terze parti possono decrittografare i dati, AES è la strada da percorrere. Avrai una chiave che condividi con le terze parti. Questa chiave viene utilizzata sia per la crittografia che per la decrittografia.

Vorrei utilizzare AES per la crittografia dei dati in blocco e RSA per crittografare la chiave AES. Se i dati sono abbastanza piccoli, crittografa il tutto con RSA.

disse Ed Haber

  

Vorrei usare AES per i dati in blocco   crittografia e RSA per crittografare il file   Chiave AES. Se i dati sono abbastanza piccoli   quindi crittografa il tutto con   RSA.

Penso che questa sia una buona soluzione. Quello che farei è che la tua applicazione pubblichi un'API per ottenere una chiave RSA pubblica. Quando una terza parte desidera inviarti qualcosa, ottiene la chiave pubblica. Quindi genera una chiave di sessione per eseguire la crittografia effettiva utilizzando un codice a blocchi (ad esempio AES) e ti invia la chiave crittografandola con la chiave pubblica. Decifrare la chiave di sessione con la chiave privata. La terza parte quindi crittografa i dati che desidera inviarti con AES (utilizzando uno schema di riempimento che pubblichi anche) e te li invia. Lo decifri usando la chiave di sessione.

Ci sono alcuni problemi con il metodo sopra. Dal momento che non stai inviando alcuna informazione (oltre a pubblicare la tua chiave pubblica, non puoi controllare come viene generata la chiave di sessione. Ciò significa che terze parti possono usare modi molto insicuri per generare la chiave di sessione e non lo saprai mai. Un secondo problema tutti quelli che vogliono inviarti i dati devono riempire i dati per AES nello stesso modo in cui lo fai tu. Quindi dovrai assicurarti che tutti si coordinino. Il secondo problema non è troppo grande, ma il primo potrebbe essere un problema soprattutto se non ti fidi tanto delle terze parti per generare chiavi di sessione davvero buone da un buon generatore di numeri casuali crittograficamente sicuro

Potresti implementare molto facilmente la tua crittografia bit basata su chiave XOR. Con un po 'di pensiero e ingegnosità, puoi inventare qualcosa di più che adatto alla tua applicazione.

Ecco un esempio di PHP:

function XOREncryption($InputString, $KeyPhrase){

    $KeyPhraseLength = strlen($KeyPhrase);

    for ($i = 0; $i < strlen($InputString); $i++){

        $rPos = $i % $KeyPhraseLength;

        $r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]);

        $InputString[$i] = chr($r);
    }

    return $InputString;
}

ColdFusion ha le funzioni di crittografia e decrittografia in grado di gestire una gamma di algoritmi e codifiche, incluso l'AES consigliato sopra.

Informazioni su: http://www.cfquickdocs.com/cf8/? GetDoc = cifrare # Cifra

Codice di esempio rapido:

Key = generateSecretKey( 'AES' , 128 )

EncryptedText = encrypt( Text , Key , 'AES' , 'Hex' )

Text = decrypt( EncryptedText , Key, 'AES' , 'Hex' )

Funzionalità simili sono disponibili con questa libreria per PHP :
http://www.chilkatsoft.com/p/php_aes.asp

... e Java, Python, Ruby e altri ...
http://www.example-code.com/java/crypt2_aes_matchPhp.asp
http://www.example-code.com/python/aes_stringEncryption.asp

Sembra che RSA sia l'algoritmo per te.

Perché il tuo server non è esposto su HTTPS? In questo modo, qualsiasi client in grado di gestire HTTPS può utilizzare il servizio in modo sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top