Fare un'integrazione con un fornitore di pagamenti online. Il fornitore di pagamenti effettuerà una richiesta web al mio server per fornire alcune informazioni sul contenuto del paniere. Da parte mia non c'è alcuna elaborazione di pagamento, devo solo essere in grado di catturare le informazioni del carrello insieme all'ID commerciante. Il fornitore di servizi di pagamento agirà per conto di più commercianti eCommerce per l'acquisizione e l'elaborazione dei dettagli della carta di credito.
Requisiti di sicurezza:
- Devo essere in grado di verificare che una richiesta provenga da uno specifico merchant
- Devo essere in grado di verificare che il messaggio non sia stato manomesso
- Devo essere in grado di convalidare la marca temporale del cliente
Poche alternative che ho.
-
Firma HMAC
- Fornitore di pagamenti per generare una firma HMAC (SHA-256). (Con una chiave di firma predefinita per il commerciante) StringToSign = MerchantId + BasketInfo + Timestamp
- Il fornitore di servizi di pagamento invia la firma sopra insieme a MerchantId, BasketInfo e Timestamp in testo chiaro in un post HTTP.
- La firma è stata verificata alla mia fine
-
Crittografia della chiave pubblica con crittografia simmetrica
- SymmetricEncryptedText = AES_Encryption (BasketInfo + Timestamp) utilizzando una chiave di crittografia simmetrica pre-concordata
- TextToPublicKeyEncrypt = MerchantId + SymmetricEncryptedText
- FinalEncryptedText = Crittografia chiave pubblica utilizzando la mia chiave pubblica (TextToPublicKeyEncrypt) FinalEncryptedText è inviato in HTTP Post
- Da parte mia, FinalEncryptedText è decodificato usando la mia chiave privata. Questo mi dà accesso a MerchantId + SymmetricEncryptedText
- Decifra SymmetricEncryptedText utilizzando la chiave simmetrica specifica di MerchantId
-
Crittografia chiave simmetrica
- StringToEncrypt = BasketInfo + Timestamp
- EncryptedText = AES Encryption (StringToEncrypt)
- MerchantId e EncryptedText vengono inviati dal fornitore di servizi di pagamento in HTTP Post
- EncryptedText viene decodificato utilizzando la chiave simmetrica specifica MerchantId
Apprezzo che tu possa fare un po 'di luce sulla valutazione di queste opzioni (o qualsiasi altro suggerimento) Tutte le comunicazioni utilizzano SSL / TLS. Quindi un uomo in mezzo all'attacco può essere escluso.
I messaggi HTTP avvengono attraverso le pagine Web dei client utilizzando una chiamata AJAX JavaScript. Quindi qualsiasi token generato utilizzando gli schemi di cui sopra dovrà essere generato e incluso nel codice JavaScript del client. (Che consente a un utente finale di vedere i token sull'origine della pagina Web)
A mio avviso, le opzioni n. 1 e n. 3 sono della stessa natura. Nell'opzione n. 2, a causa della crittografia a chiave pubblica, MerchantId non viene mostrato in chiaro sull'origine HTML dell'utente. Ma rende davvero il # 2 più sicuro perché MerchantId non è visibile sulla sorgente HTML dell'utente?
Chiedo scusa in anticipo per la lunga domanda. Fammi sapere se sono richiesti chiarimenti.