Sistema de cifrado de una cadena mediante cripto-js con hex de codificación para hacer url amigables

Estoy usando crypto-js por brix. Tengo esta función a continuación que maneja el cifrado de un texto sin formato.

import CryptoJS from 'crypto-js'
import AES from 'crypto-js/aes'

const SECRET = 'I am batman'
const plainText = 'This is Sparta!'

export function enc(plainText){
    //returns something like this U2FsdGVkX184He5Rp991JYAiCSdTwfZs8T3kJUk3zAc=  
    //but with random `/` and I dont want that
    //I want it to be Hex but .toString(CryptoJs.enc.Hex) 
    //is not working, it just returns an '' empty string
    //it's a string, I checked using typeof
    return AES.encrypt(plainText, SECRET).toString();
}

¿Cómo puedo hacer que el enc(string) para devolver un Hex valor que es la url amigable?

  • Si tienes problemas con el / ¿por qué no utilizar la dirección URL segura de codificación de Base64?
  • Hola @ArtjomB. Sí, pero, .toString(CryptoJs.enc.Base64) no está trabajando en AES.encrypt()
  • Ya codificada en Base64. Sólo tiene que reemplazar algunos de los caracteres (ver este).
  • la sustitución de caracteres va a afectar a la integridad de los datos.
  • Bueno, habría que reemplazar de nuevo cuando usted desea utilizar el cifrado para descifrarlo.
InformationsquelleAutor CENT1PEDE | 2017-06-23

1 Kommentar

  1. 6

    Es probable que se quiere hacer:

    export function dec(cipherText){
       var bytes = CryptoJS.AES.decrypt(cipherText, SECRET);
       var hex = bytes.toString(CryptoJS.enc.Hex);
       var plain = bytes.toString(CryptoJS.enc.Utf8);
       return [hex, plain];
    }

    Este toma el cifrado base64 cadena y devolverá el texto desencriptado y hexadecimal.

    EDIT: En cuanto a tu comentario y editado pregunta:

    const SECRET = 'I am batman'
    
    function enc(plainText){
        var b64 = CryptoJS.AES.encrypt(plainText, SECRET).toString();
        var e64 = CryptoJS.enc.Base64.parse(b64);
        var eHex = e64.toString(CryptoJS.enc.Hex);
        return eHex;
    }
    
    function dec(cipherText){
       var reb64 = CryptoJS.enc.Hex.parse(cipherText);
       var bytes = reb64.toString(CryptoJS.enc.Base64);
       var decrypt = CryptoJS.AES.decrypt(bytes, SECRET);
       var plain = decrypt.toString(CryptoJS.enc.Utf8);
       return plain;
    }

    El resultado final se lleva a la base64 cadena, hace hexadecimal y devuelve la cadena descifrada.

    • Hola, gracias por responder. Im sorry creo que me «mis-le preguntó:» mi pregunta. He actualizado. Que fue descuidado de mí. Lo que quiero decir es que quiero enc(string) para volver Hex de modo que se podía utilizar en la url.
    • Wow, gracias hombre. Se trabajó. Me acabo de enterar de que NodeJs tiene un nativo de Crypto implemantation con aes-256-ctr así. ¿Cuál es su opinión sobre eso?
    • Eres bienvenido! Yo diría que el nativo de crypto podría ser una buena cosa a tener en como no estoy seguro de cómo asegurar CryptoJS es para algo que podría ser altamente sensible. Algunos de los métodos CryptoJS utiliza parecen fecha y no estoy seguro de que me gusta el defecto de forma en el que sales de la cadena cifrada…
    • Hola, tengo una preocupación. Parece que esta configuración enc(string) produce una diferente hexagonal de cada iteración incluso si encripto la misma cadena, que no es buena coz estoy guardando el hex de salida como referencia para mis datos. string1 = 23h52kh5242h235232 = string1 string1 = 23h52kh52gjh235144 = string1
    • Bueno, eso es una especie de punto de cifrado de algo. Si usted está necesitando la cadena ser estático, a continuación, es probable que quieras hash de alguna manera en su lugar.
    • Yo era capaz de lograr lo que quiero utilizando nodejs’ cripto. El proceso es prácticamente el mismo con lo que hizo, excepto que usted puede decirle explícitamente el algo de lo que a comprimir en. crypto.createCipher('aes-256-ctr', SECRET).update(plainText, 'utf8', 'hex') y el resultado es el mismo. Mi conjetura es que hay algo que hacer cuando se codifica a base64, sólo una conjetura tho.
    • Dos preguntas: (1) ¿Qué es e64 en el enc función fragmento de código que has publicado? (2) ¿Cuál es el tipo de retorno de CryptoJS.AES.encrypt y CryptoJS.AES.decrypt métodos?
    • toma la resultante cadena base64 y se convierte en hexadecimal. Para CryptoJS.AES.encrypt el tipo sería Base64, para decrypt el tipo de retorno es Hexadecimal, pero para ASCII puede utilizar toString(CryptoJS.enc.Utf8).
    • es en realidad un WordArray. Hice algunas investigaciones en el mientras tanto, después de publicar el comentario. Para cualquier persona que está leyendo esto, aquí está una explicación más detallada: stackoverflow.com/q/58524245/303685
    • Sí, tienes razón… aunque su propósito es transformar la anterior Base64valor a Hexadecimal. Si usted console.log(e64.toString()) la verás en la no-formulario de matriz. Básicamente, si usted hizo CryptoJS.enc.Base64.parse(b64).toString(); usted no necesita usar eHex y acabo de volver de e64 — saludos! 🙂
    • Lo vemos en hexadecimal siempre que imprima los datos binarios porque hexadecimal es un imprimible la notación. No es un tipo de datos. Es simplemente una manera de escribir algo. Eso no significa que subyace una hexadecimal tipo de datos. Usted puede escribir los datos numéricos en la notación hexadecimal. En contraste, un tipo de datos no sólo representa un valor subyacente, pero también tiene un tamaño.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea