2017-12-19 4 views
0

Ich bin eine object im Frontend verschlüsseln und senden Sie eine HTTP-POST-Anfrage mit den verschlüsselten Daten. Im Backend versuche ich dieses Objekt zu entschlüsseln, aber es schlägt fehl.Digitale Envelope Routinen: Bad Decrypt

Die Prüfungen sind vorbei, aber wenn sie mit Fehler dem eigentlichen Projekt dieser decrypt Methode versagt integriert:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt at Error (native) at Decipher.final (crypto.js:158:26) at Object.exports.decrypt.error [as decrypt]

Hier ist der relevante Code:

export const decrypt = text => { 
    if (!text) 
    throw Error('Decrypt: Text may not be blank'); 
    const decipher = crypto.createDecipher(encryptAlgorithm, 
    encryptionKey) 
    let decrypted = decipher.update(text, textEncodingHex, 
    textEncodingUtf8) 
    decrypted += decipher.final(textEncodingUtf8) 
    return decrypted 
} 

Und das ist, wie ich es bin mit

authSignInWeb(): any { 
    return async (request: any, reply: any) => { 
    try { 
     let decrytedRequestPayload = request.payload; 
     if (process.env.REACT_APP_ENCRYPT) { 
     decrytedRequestPayload = JSON.parse(cryptoHelper.decrypt(request.payload)) 
     } 
     ... 
    } catch (error) { 
     reply(error); 
     ... 
    } 
    }; 
}; 
+0

Warum nicht nur HTTPS verwenden, es funktioniert einfach und ist sicher. – zaph

Antwort

0

Nach Durchlaufen der Dokumentation und andere Online-Res Ich habe es geschafft, dieses Problem zu lösen. Was dies zum Scheitern brachte, ist, dass HapiJs die ankommende Nutzlast übernimmt, analysiert und an das authSignInWeb() als Javascript-Objekt mit der eigentlichen Nutzlast als Schlüssel in dem Objekt weitergibt, das sie für mich macht.

Um dies zu lösen, musste ich im Frontend die Daten verschlüsseln, manuell ein Objekt erstellen und die verschlüsselten Informationen zuordnen. Und dann im Backend auf den Payload-Schlüssel des Objekts zugreifen.

In Code:

Das Frontend wie so ist:

let encryptedData = {}; 
if (process.env.REACT_APP_ENCRYPT) { 
    encryptedData.data = Crypt.encrypt(JSON.stringify(requestBody)) 
} 

und dann im Backend (innen authSignInWeb()) tun:

let userAuthData = request.payload; 
if (process.env.REACT_APP_ENCRYPT) { 
    userAuthData = JSON.parse(cryptoHelper.decrypt(userAuthData.data)) 
}