node.js - example - password encryption node js
Obteniendo el hash de un archivo utilizando las capacidades de flujo del módulo de cifrado(es decir: sin hash.update y hash.digest) (5)
Del fragmento citado en la pregunta:
[la clase Hash] Es una secuencia que es legible y escribible. Los datos escritos se usan para calcular el hash. Una vez que el lado escribible de la secuencia finaliza, use el método read () para obtener el resumen hash calculado.
Entonces, lo que necesitas para hacer hash es texto:
var crypto = require(''crypto'');
// change to ''md5'' if you want an MD5 hash
var hash = crypto.createHash(''sha1'');
// change to ''binary'' if you want a binary hash.
hash.setEncoding(''hex'');
// the text that you want to hash
hash.write(''hello world'');
// very important! You cannot read from the stream until you have called end()
hash.end();
// and now you get the resulting hash
var sha1sum = hash.read();
Si desea obtener el hash de un archivo, la mejor manera es crear un ReadStream del archivo y canalizarlo al hash:
var fs = require(''fs'');
var crypto = require(''crypto'');
// the file you want to get the hash
var fd = fs.createReadStream(''/some/file/name.txt'');
var hash = crypto.createHash(''sha1'');
hash.setEncoding(''hex'');
fd.on(''end'', function() {
hash.end();
console.log(hash.read()); // the desired sha1sum
});
// read all file and pipe it (write it) to the hash object
fd.pipe(hash);
El módulo crypto
de node.js (en el momento de escribir esto al menos) aún no se considera estable y, por lo tanto, la API puede cambiar. De hecho, los métodos que todos en Internet usan para obtener el hash (md5, sha1, ...) de un archivo se consideran heredados (de la documentación de la clase Hash
) (nota: énfasis mío):
Clase: hash
La clase para crear hash resume de datos.
Es un flujo que es legible y escribible. Los datos escritos se usan para calcular el hash. Una vez que el lado escribible de la secuencia finaliza, use el método read () para obtener el resumen hash calculado. La actualización heredada y los métodos de resumen también son compatibles.
Devuelto por crypto.createHash.
A pesar de que hash.update
y hash.digest
se consideran heredados, el ejemplo que se muestra justo arriba del fragmento entre comillas los está usando.
¿Cuál es la forma correcta de obtener hashes sin usar esos métodos heredados?
Seguir puliendo, ECMAScript 2015
function checksumFile(algorithm, path) {
return new Promise((resolve, reject) =>
fs.createReadStream(path)
.on(''error'', reject)
.pipe(crypto.createHash(algorithm)
.setEncoding(''hex''))
.once(''finish'', function () {
resolve(this.read())
})
)
}
Una versión ES6 que devuelve una Promesa para el resumen hash:
function checksumFile(hashName, path) {
return new Promise((resolve, reject) => {
let hash = crypto.createHash(hashName);
let stream = fs.createReadStream(path);
stream.on(''error'', err => reject(err));
stream.on(''data'', chunk => hash.update(chunk));
stream.on(''end'', () => resolve(hash.digest(''hex'')));
});
}
Versión corta de la respuesta de Carlos:
var fs = require(''fs'')
var crypto = require(''crypto'')
fs.createReadStream(''/some/file/name.txt'').
pipe(crypto.createHash(''sha1'').setEncoding(''hex'')).
on(''finish'', function () {
console.log(this.read()) //the hash
})
var fs = require(''fs'');
var crypto = require(''crypto'');
var fd = fs.createReadStream(''data.txt'');
var hash = crypto.createHash(''md5'');
hash.setEncoding(''hex'');
fd.pipe(hash);
hash.on(''data'', function (data) {
console.log(''# '',data);
});