Estoy creando una aplicación con reactnative y laravel,
entonces mi código en laravel está creando un código Qr con datos encriptados y enviándolo a mi interfaz (Reactjs),
Cuando intento descifrar en reaccionar nativo usando Crypto js, agrega algunas características que no agregué en mi back-end,
Mostraré todas las funciones y ejemplos,
//Código en laravel crypt mi información QR
$unix =time(); $unix_hashed = Crypt::encrypt($unix); return QrCode::size(100)->generate($unix_hashed);
// Código en reaccionar nativo con cryptojs para el descifrado
var key = '6AhFLqwlExB9tn2Twql62EtbFDqBEv+S7tXW3h6a/0o='; let encrypted = atob(data); encrypted = JSON.parse(encrypted); const iv = CryptoJS.enc.Base64.parse(encrypted.iv); const value = encrypted.value; key = CryptoJS.enc.Base64.parse(key); var decrypted = CryptoJS.AES.decrypt(value, key, { iv: iv }); decrypted = decrypted.toString(CryptoJS.enc.Utf8);
// ejemplo de la salida en la consola:
pero el problema debería ser así:
yo:1634986874;
el " " & yo & : & ; es extra
Alguien me puede ayudar
Gracias
Crypt::encrypt()
usa AES-256 en modo CBC por defecto, s. aquí
Antes del cifrado, el texto sin formato se serializa llamando a la función de PHP serialize()
generando una representación almacenable del valor. Por ejemplo, serialize(1635015182)
devuelve i:1635015182;
y serialize('Hello world')
devuelve s:11: "Hello world";
. En los datos serializados, i
denota un número entero, s:11
denota una cadena de 11 caracteres.
Si el descifrado se realiza con Crypt::decrypt()
, se llama a unserialize()
después del descifrado, que deserializa los datos y restaura el texto sin formato original.
Al descifrar con otra biblioteca, como CryptoJS, la deserialización no se realiza, por lo que se devuelven los textos sin formato serializados. Por lo tanto, la deserialización debe hacerse manualmente aquí.
Afortunadamente, existe la biblioteca locutus que proporciona puertos de funcionalidades de PHP a JavaScript, por lo que unserialize()
también se puede ejecutar bajo JavaScript/NodeJS sin mucho esfuerzo:
var CryptoJS = require('crypto-js'); var atob = require('atob'); var unserialize = require('locutus/php/var/unserialize') // ciphertext from Crypt::encrypt() var data = "eyJpdiI6IkYyaDhxenFJM0FjaW56TW83NkpuNHc9PSIsInZhbHVlIjoiNzhSeUs5em1WblpaRWk2OVBWVURnUT09IiwibWFjIjoiODg1NGFkOTk0MGVjMjIxODAyNzExOTgxYjhiMDM4YjliMmM5NzE5Mjc0YzFmNDVlMWU1MWRkMTQ2N2Q5ODdmNCJ9" var key = '6AhFLqwlExB9tn2Twql62EtbFDqBEv+S7tXW3h6a/0o='; let encrypted = atob(data); encrypted = JSON.parse(encrypted); const iv = CryptoJS.enc.Base64.parse(encrypted.iv); const value = encrypted.value; key = CryptoJS.enc.Base64.parse(key); var decrypted = CryptoJS.AES.decrypt(value, key, { iv: iv }); decrypted = decrypted.toString(CryptoJS.enc.Utf8); // unserialize console.log(decrypted); // i:1635015182; console.log(unserialize(decrypted)); // 1635015182
La llamada unserialize()
en la última línea restaura el texto sin formato original.
Tenga en cuenta que encrypted.mac
contiene un MAC para verificar la integridad de los datos. Aquí puede encontrar una implementación de PHP para Crypt::encrypt()
.