Quiero crear un hash de I love cupcakes (firmado con la clave de abcdeg)

¿Cómo puedo crear ese hash, el uso de Node.js Crypto?

InformationsquelleAutor user847495 | 2011-09-20

3 Comentarios

  1. 93

    Un par de años atrás se decía que update() y digest() fueron los métodos heredados y los nuevos streaming API enfoque fue introducido. Ahora los médicos dicen que el método puede ser utilizado. Por ejemplo:

    var crypto    = require('crypto');
    var text      = 'I love cupcakes';
    var secret    = 'abcdeg'; //make this your secret!!
    var algorithm = 'sha1';   //consider using sha256
    var hash, hmac;
    
    //Method 1 - Writing to a stream
    hmac = crypto.createHmac(algorithm, secret);    
    hmac.write(text); //write in to the stream
    hmac.end();       //can't read from the stream until you call end()
    hash = hmac.read().toString('hex');    //read out hmac digest
    console.log("Method 1: ", hash);
    
    //Method 2 - Using update and digest:
    hmac = crypto.createHmac(algorithm, secret);
    hmac.update(text);
    hash = hmac.digest('hex');
    console.log("Method 2: ", hash);

    Probado en el nodo v6.2.2 y v7.7.2

    Ver https://nodejs.org/api/crypto.html#crypto_class_hmac. Da más ejemplos de la utilización de la transmisión de enfoque.

    • No de una sola línea, y las llamadas no pueden ser encadenados… pero voy a utilizar este enfoque.
    • No puedo, por la vida de mí, hacen de este trabajo. hmac.read() devuelve un » [objeto SlowBuffer]» y si trato de leer los contenidos el uso de hmac.leer().toString(‘hex’); no tengo el valor esperado. Si yo uso la actualización/digest obsoleto enfoque, devuelve la cadena esperada. Estoy usando esto para validar una firma de un tercero POST a mis servidores. Alguna idea de lo que está pasando?
    • Quizás el hmac.leer está ocurriendo antes de los datos se ha volcado a la corriente? Tal vez hmac.leer debe ser impulsado por la corriente de acabado del evento?
    • En realidad, el enlace que has publicado explícitamente menciona el uso de update y no write. Estoy confundido, cual es la mejor práctica ahora? No puedo encontrar los recursos que decir que tan claramente como usted lo menciona.
    • Como de Nov. 2016, digest y update han no no se utiliza y se presentan en la documentación: nodejs.org/api/crypto.html#crypto_class_hmac. Recomiendo el uso de la secuencia de la API sólo si estás leyendo a partir de una secuencia.
    • Es cierto, update y digest no fueron depreciados. Cuando originalmente respondió a esta pregunta en 2013, los médicos dijeron que eran «los métodos heredados», pero se cambiaron en 2015 a decir, usando el hilo de los arroyos (como en mi respuesta) o el uso de update y digest (como en Ricardo de la respuesta) son métodos válidos. Aquí es donde los documentos se han modificado y el aquí son los actuales docs.
    • funciona bien tanto de ellos. Lo que recomendamos utilizar?
    • actualización y digerir.

  2. 21

    Gwerder la solución no funciona porque hash = hmac.read(); que sucede antes de que la corriente se realiza a la finalización. Por lo tanto AngraX en la materia. También la hmac.write declaración de la onu-es necesario en este ejemplo.

    En lugar de hacer esto:

    var crypto    = require('crypto');
    var hmac;
    var algorithm = 'sha1';
    var key       = 'abcdeg';
    var text      = 'I love cupcakes';
    var hash;
    
    hmac = crypto.createHmac(algorithm, key);
    
    //readout format:
    hmac.setEncoding('hex');
    //or also commonly: hmac.setEncoding('base64');
    
    //callback is attached as listener to stream's finish event:
    hmac.end(text, function () {
        hash = hmac.read();
        //...do something with the hash...
    });

    Más formalmente, si lo desea, la línea de

    hmac.end(text, function () {

    podría ser escrito

    hmac.end(text, 'utf8', function () {

    porque en este ejemplo de texto es una cadena utf

    • Estás equivocado, no hay necesidad de agregar una devolución de llamada. Esta corriente es sincrónico y es legible a la derecha después de end() es llamado. La mayoría de los fascinantes cosa es lo que está escrito en la documentación oficial, pero todo el mundo tiene que poner sus 5 (doblada) centavos.
    • Estás trolling? Tal vez usted debe leer la documentación. Si intenta leer la secuencia antes de la final del evento, se producirá un error.
    • A partir de [nodejs.org/api/crypto.html#crypto_class_hmac] It is a stream that is both readable and writable. The written data is used to compute the hmac. Once the writable side of the stream is ended, use the read() method to get the computed digest. de leer cuando de escritura lado terminó, no es necesario siquiera esperar para cuando legible lado se convierte en legible (a pesar de que seguramente no). Leer su documentación, por favor.
    • createHmac crea un stream. «terminó» en la documentación en línea que usted cita anterior no significa hmac.end(...) ha sido llamado, «terminó» significa que el flujo ha planteado su acabado evento, que es por qué el comando acepta una devolución de llamada. Después de la final() método que se llama, el flujo requiere de tiempo para vaciar los datos para el sistema subyacente. Si la llamada a read() antes de la meta del evento es elevada, se producirá un error. Vaya por delante y paster Gwerder código JSbin y ver por ti mismo. Usted debe tener una lectura de la Streams documentación para entender cómo funciona.
    • Lo he utilizado en el código de producción durante algún tiempo y es estable como el infierno. Sinceramente, no sé lo que JSBin es, pero también he probado el código admite en nodejs con solo copiar y pegar y funciona también. Usted no debe imaginar significados adicionales a la documentación. «terminó» siempre significa «terminado» en todas partes en la documentación. Sin embargo, de nuevo, parece que entienden que la corriente tiene 2 lados. Y en la documentación que se indica explícitamente que la persona puede utilizar read() cuando de escritura lado terminó, y no hay nada acerca de finalizar el evento.
    • E incluso algunos abstractos solución que lee hmac de todo el mundo no debe depender de de escritura finish evento, pero en legible readable y end eventos.
    • Por su lógica está bien para leer los datos cuando el sistema decide que se han hecho de flushing todos los datos necesarios para generar, pero antes de que datos reales productor genera nada. Así que por qué no introducir extremadamente permeable abstracciones y de devolución de llamada infierno cuando tenemos un sistema(que en realidad es puramente sincrónico) que está garantizado para trabajar de una manera simple, eficaz y de manera predecible?

Dejar respuesta

Please enter your comment!
Please enter your name here