Estoy interesado en construir una pequeña aplicación para uso personal que se va a cifrar y descifrar la información en el lado del cliente con JavaScript. El cifrado de la información será almacenada en una base de datos en un servidor, pero nunca la versión descifrada.

No tiene que ser super duper seguro, pero me gustaría usar una ininterrumpida algoritmo.

Idealmente me gustaría ser capaz de hacer algo como

var gibberish = encrypt(string, salt, key);

para generar la cadena codificada, y algo así como

var sensical = decrypt(gibberish, key);

decodificación de la tarde.

Hasta ahora he visto esto:
http://bitwiseshiftleft.github.io/sjcl/

Cualquier otras bibliotecas que debo mirar?

  • Echa un vistazo a Javascript cifrado AES
  • jsfiddle.net/kein1945/M9K2c
  • Parte de la terminología aquí está apagado, he Aquí una sencilla versión 1. Las sales se agregan a la información (normalmente las contraseñas se cifran. Su propósito es hacer el hash diferente de lo que sería sin la sal. Esto es útil porque hace pre-generados de hashes si su base de datos obtiene hackeado y hash de las contraseñas de los usuarios de salir. 2. Hash es una forma de operación que se traduce de entrada en la salida. No puede ser fácilmente revertir o deshacer. 3. La codificación no está cifrado. base64_encode, urlencode, etc.
InformationsquelleAutor jeremiahs | 2013-08-16

8 Comentarios

  1. 142

    JS:

     var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
    //U2FsdGVkX18ZUVvShFSES21qHsQEqZXMxQ9zgHy+bu0=
    
    var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
    //4d657373616765
    
    
    document.getElementById("demo1").innerHTML = encrypted;
    document.getElementById("demo2").innerHTML = decrypted;
    document.getElementById("demo3").innerHTML = decrypted.toString(CryptoJS.enc.Utf8);

    HTML:

    Full working sample actually is:
    
        <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
    
    <br><br>
    <label>encrypted</label>
    <div id="demo1"></div>
    <br>
    
    <label>decrypted</label>
    <div id="demo2"></div>
    
    <br>
    <label>Actual Message</label>
    <div id="demo3"></div>

    • Gracias Tomas. ¿Sabe usted de la cifra de sting es compatible con JavaScript?
    • Cifrada en realidad es un objeto, pero usted puede llamar cifrados.toString() para obtener la cadena. Usted será capaz de descifrar esa cadena posterior: jsbin.com/kofiqokoku/1
    • Pero, ¿cómo podemos proteger la contraseña Secreta?
    • Es hasta donde se puede almacenar y cómo recuperar esa contraseña secreta. La muestra solo se muestra cómo utilizar.
    • Parece crypto js es una archivados proyecto. Hay un clon en github: github.com/sytelus/CryptoJS, pero no ha sido actualizado en dos años. ¿Esta es la mejor opción para js cifrado?
    • Me gustaría ir con esto: github.com/brix/crypto-js también está disponible a través del MECANISMO nacional de prevención
    • Pero, ¿cómo puede este mensaje cifrado más descifrados por el NodeJS? Me refiero a que si el cliente de Javascript del lado de cifrar la información como usted lo menciona, entonces si pasamos a Nodejs servidor de la aplicación, entonces lo que será su código? Creo que podemos utilizar ‘crypto’ módulo, pero ¿cuál será el código exacto? He intentado en mi final, pero no han tenido éxito.
    • Se puede saber ¿cómo se puede almacenar y recuperar la Secret passphrase ?
    • es hasta usted cómo y dónde se almacenan. No sé si realmente hay forma segura de guardar en un navegador. Solicitud del servidor y almacenar en la memoria.

  2. 54

    ¿ CryptoJS ?

    Es un sólido crypto de la biblioteca, con un montón de funcionalidades. Se implementa hashers, HMAC, PBKDF2 y sistemas de cifrado. En este caso sistemas de cifrado es lo que usted necesita. Retirar la guía de inicio rápido guía de la página del proyecto.

    Que usted podría hacer algo parecido con el AES:

    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
    
    <script>
        var encryptedAES = CryptoJS.AES.encrypt("Message", "My Secret Passphrase");
        var decryptedBytes = CryptoJS.AES.decrypt(encryptedAES, "My Secret Passphrase");
        var plaintext = decryptedBytes.toString(CryptoJS.enc.Utf8);
    </script>

    Como los de seguridad, en el momento de la escritura del algoritmo AES está pensado para ser ininterrumpida

    Edición :

    Parece en línea de la dirección URL es abajo & usted puede utilizar los archivos descargados para el cifrado desde el siguiente enlace & lugar los respectivos archivos en la carpeta raíz de la aplicación.

    https://code.google.com/archive/p/crypto-js/downloads

    o utilizado para otros CDN como https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js

    • ¿Cuál es la diferencia entre las estructuras y componentes en la carpeta 3.1.2?
    • Después de jugar un poco los componentes son separados partes. Usted necesita saber que los componentes a tomar (y en qué orden) para que funcione. Los paquetes acumulativos de actualizaciones de los archivos que contienen todo lo necesario para hacer que funcione con un solo script de referencia (mucho mejor que el trabajo duro ya está hecho).
    • Pero, ¿cómo podemos proteger la contraseña Secreta ?
  3. 25

    He creado un simple texto cifrado/descifrado util. Sin dependencias con ninguna librería externa.

    Estas son las funciones

    let cipher = salt => {
        let textToChars = text => text.split('').map(c => c.charCodeAt(0))
        let byteHex = n => ("0" + Number(n).toString(16)).substr(-2)
        let applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code)    
    
        return text => text.split('')
            .map(textToChars)
            .map(applySaltToChar)
            .map(byteHex)
            .join('')
    }
    
    let decipher = salt => {
        let textToChars = text => text.split('').map(c => c.charCodeAt(0))
        let saltChars = textToChars(salt)
        let applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code)
        return encoded => encoded.match(/.{1,2}/g)
            .map(hex => parseInt(hex, 16))
            .map(applySaltToChar)
            .map(charCode => String.fromCharCode(charCode))
            .join('')
    }

    Y se puede utilizar de la siguiente manera:

    //To create a cipher
    let myCipher = cipher('mySecretSalt')
    
    //Then cipher any text:
    myCipher('the secret string')   //--> "7c606d287b6d6b7a6d7c287b7c7a61666f"
    
    //To decipher, you need to create a decipher and use it:
    let myDecipher = decipher('mySecretSalt')
    myDecipher("7c606d287b6d6b7a6d7c287b7c7a61666f")    //--> 'the secret string'
    • vamos a myDecipher = descifrar(‘CartelSystem’) – Esta sal descifrar la cadena así. Usted no tiene que saber la palabra exacta ‘mySecretSalt’
    • También, es saltChars en descifrar que no están siendo utilizados?
    • Creo que se debe convertir este código de una simple npm paquete. Es muy útil!! Acabo de terminar de usarlo en Reaccionar de la aplicación, después de algunas soluciones 🙂
  4. 10

    Las respuestas existentes que se aprovecha de SJCL, CryptoJS, y/o WebCrypto no necesariamente malo, pero no son tan seguros como los que inicialmente podría sospechar. En general, usted quiere uso libsodium. En primer lugar voy a explicar por qué, entonces, ¿cómo.

    ¿Por qué No SJCL, CryptoJS, WebCrypto, etc.?

    Respuesta corta: En orden para que el cifrado de estar realmente seguro, estas bibliotecas esperar a hacer demasiadas opciones por ejemplo, el cifrado de bloques modo (CBC, CTR, GCM; si usted no puede decir que de los tres que acabo de exponer es seguro de usar y bajo qué restricciones, usted no debería tener que cargar con este tipo de elección en todos los).

    A menos que su trabajo de título es criptografía ingeniero, las probabilidades están en contra de implementar de forma segura.

    Por qué no CryptoJS?

    CryptoJS ofrece un puñado de bloques de construcción, y espera que usted sabe cómo usarlos de forma segura. Incluso los valores predeterminados para el modo CBC (archivado).

    ¿Por qué es el modo CBC malo?

    Leer este reportaje en AES-CBC vulnerabilidades.

    Por qué no WebCrypto?

    WebCrypto es una comida estándar, diseñado por el comité, para efectos de que son ortogonales a la criptografía de ingeniería. Específicamente, WebCrypto estaba destinado a reemplazar a Flash, no proporcionan seguridad.

    Por qué no SJCL?

    SJCL públicos de la API y documentación ruega a los usuarios cifrar los datos con un humano-recordar contraseña. Este es raramente, si nunca, lo que usted quiere hacer en el mundo real.

    Además: Su defecto PBKDF2 ronda de conteo es de aproximadamente 86 veces tan pequeño como usted quiere que sea. AES-128-MCP es probablemente muy bien.

    De las tres opciones anteriores, SJCL es el menos probabilidades de terminar en lágrimas. Pero hay mejores opciones disponibles.

    ¿Por qué es Libsodium Mejor?

    Que no es necesario elegir entre un menú de modos de cifrado, las funciones de hash, y otros huelga opciones. Nunca te riesgo de cagarla sus parámetros y la eliminación de toda la seguridad de su protocolo.

    Lugar, libsodium sólo le da opciones simples en sintonía para la máxima seguridad y minimalista Api.

    • crypto_box() /crypto_box_open() ofrecer autenticada de cifrado de clave pública.
      • El algoritmo en cuestión combina X25519 (ECDH más de Curve25519) y XSalsa20-Poly1305, pero usted no necesita saber (o incluso atención) acerca de que para utilizar de manera segura
    • crypto_secretbox() /crypto_secretbox_open() oferta compartida de clave de cifrado autenticado.
      • El algoritmo en cuestión es XSalsa20-Poly1305, pero usted no necesita saber/cuidado de

    Además, libsodium ha enlaces en docenas de lenguajes de programación, por lo que es muy probable que libsodium se sólo el trabajo cuando tratando de interactuar con otra programación de la pila. También, libsodium tiende a ser muy rápido sin sacrificar la seguridad.

    Cómo Utilizar Libsodium en JavaScript?

    Primer lugar, usted necesita decidir una cosa:

    1. No te quieren sólo para cifrar/descifrar los datos (y quizás de alguna manera utilizar el texto en consultas de base de datos de forma segura) y no preocuparse por los detalles? O…
    2. Hacer que usted necesita para implementar un protocolo específico?

    Si seleccionó la primera opción, obtener CipherSweet.js.

    La documentación es disponible en línea. EncryptedField es suficiente para la mayoría de los casos de uso, pero el EncryptedRow y EncryptedMultiRows Api puede ser más fácil si usted tiene un montón de distintos campos que desea cifrar.

    Con CipherSweet, usted no necesita siquiera saben lo que es un nonce/IV es a utilizar de manera segura.

    Además, se encarga de int/float de cifrado sin fugas de los hechos acerca de los contenidos a través de texto cifrado tamaño.

    De lo contrario, usted querrá de sodio-plus, que es un fácil de usar interfaz para varios libsodium contenedores. De sodio-Plus permite escribir de rendimiento, asincrónico, de la cruz-plataforma de código que sea fácil de auditoría y de la razón acerca de.

    Para instalar sodio-plus, simplemente ejecutar…

    npm install sodium-plus

    Actualmente no hay público CDN para soporte de los navegadores. Esto va a cambiar pronto. Sin embargo, usted puede tomar sodium-plus.min.js de la última versión de Github si la necesita.

    JS:

    const { SodiumPlus } = require('sodium-plus');
    let sodium;
    
    (async function () {
        if (!sodium) sodium = await SodiumPlus.auto();
        let plaintext = 'Your message goes here';
        let key = await sodium.crypto_secretbox_keygen();
        let nonce = await sodium.randombytes_buf(24);
        let ciphertext = await sodium.crypto_secretbox(
            plaintext,
            nonce,
            key    
        );
        console.log(ciphertext.toString('hex'));
    
        let decrypted = await sodium.crypto_secretbox_open(
            ciphertext,
            nonce,
            key
        );
    
        console.log(decrypted.toString());
    })();

    La documentación para de sodio-plus está disponible en Github.

    Si quieres paso por paso tutorial, este dev.el artículo tiene lo que estás buscando.

  5. 2

    CryptoJS ya no es compatible. Si desea continuar utilizando, usted puede cambiar a esta url:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>

    • ¿Cuál es la diferencia entre las estructuras y componentes en la carpeta 3.1.2?
    • Crypto es recomendar el forjar biblioteca cuando usted entra a su sitio.
  6. 2

    Uso SimpleCrypto

    Utilizando encrypt() y descifrar()

    Utilizar SimpleCrypto, primero debe crear una SimpleCrypto instancia con un
    clave secreta (password). Clave secreta de parámetros DEBEN ser definidos cuando
    la creación de un SimpleCrypto instancia.

    Para cifrar y descifrar datos, basta con utilizar encrypt() y descifrar()
    la función de una instancia. Esto va a utilizar AES-CBC algoritmo de cifrado.

    var _secretKey = "some-unique-key";
    
    var simpleCrypto = new SimpleCrypto(_secretKey);
    
    var plainText = "Hello World!";
    var chiperText = simpleCrypto.encrypt(plainText);
    console.log("Encryption process...");
    console.log("Plain Text    : " + plainText);
    console.log("Cipher Text   : " + cipherText);
    var decipherText = simpleCrypto.decrypt(cipherText);
    console.log("... and then decryption...");
    console.log("Decipher Text : " + decipherText);
    console.log("... done.");
  7. -1

    Funciones simples,

    
    function Encrypt(value) 
    {
      var result="";
      for(i=0;i<value.length;i++)
      {
        if(i<value.length-1)
        {
            result+=value.charCodeAt(i)+10;
            result+="-";
        }
        else
        {
            result+=value.charCodeAt(i)+10;
        }
      }
      return result;
    }
    function Decrypt(value)
    {
      var result="";
      var array = value.split("-");
    
      for(i=0;i<array.length;i++)
      {
        result+=String.fromCharCode(array[i]-10);
      }
      return result;
    } 
    • Mientras este fragmento de código puede ser la solución, incluyendo una explicación realmente ayuda a mejorar la calidad de tu post. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, y esas personas pueden no saber las razones de su sugerencia de código.
    • Esto no es un algoritmo de seguridad (tenga en cuenta que Cifrar no es un parámetro clave) y puede ser fácilmente revertido de ingeniería. El OP pregunté por algo que había seguridad en él.

Dejar respuesta

Please enter your comment!
Please enter your name here