[hash] node.js 해시 문자열?

해시하려는 문자열이 있습니다. node.js에서 해시를 생성하는 가장 쉬운 방법은 무엇입니까?

해시는 보안이 아닌 버전 관리를위한 것입니다.



답변

crypto.createHash (algorithm)를 살펴보십시오

var filename = process.argv[2];
var crypto = require('crypto');
var fs = require('fs');

var md5sum = crypto.createHash('md5');

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  md5sum.update(d);
});

s.on('end', function() {
  var d = md5sum.digest('hex');
  console.log(d + '  ' + filename);
});


답변

간단한 문자열을 md5 해시하려는 경우 이것이 나를 위해 작동한다는 것을 알았습니다.

var crypto = require('crypto');
var name = 'braitsch';
var hash = crypto.createHash('md5').update(name).digest('hex');
console.log(hash); // 9b74c9897bac770ffc029102a200c5de


답변

노드의 암호화 모듈 API가 여전히 불안정합니다.

버전 4.0.0부터는 기본 Crypto 모듈이 더 이상 불안정하지 않습니다. 로부터 공식 문서 :

암호화

안정성 : 2-안정

API가 만족스러운 것으로 입증되었습니다. npm 에코 시스템과의 호환성은 우선 순위가 높으며 반드시 필요한 경우가 아니면 깨지지 않습니다.

따라서 외부 종속성없이 기본 구현을 사용하는 것이 안전하다고 간주해야합니다.

참고로 Crypto 모듈이 여전히 불안정 할 때 아래에 언급 된 모듈이 대체 솔루션으로 제안되었습니다.


모듈 중 하나를 사용할 수도 있습니다 작업을 수행하는 sha1 또는 md5 .

$ npm install sha1

그리고

var sha1 = require('sha1');

var hash = sha1("my message");

console.log(hash); // 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb

또는

$ npm install md5

그리고

var md5 = require('md5');

var hash = md5("my message");

console.log(hash); // 8ba6c19dc1def5702ff5acbf2aeea5aa

(MD5는 안전하지 않지만 Gravatar와 같은 서비스에서 자주 사용됩니다.)

이 모듈의 API는 변경되지 않습니다!


답변

sha256("string or binary");

다른 답변에 문제가 발생했습니다. 인코딩 인수를로 설정하는 것이 좋습니다.binary바이트 문자열을 사용하도록 하고 Javascript (NodeJS)와 Python, PHP, Github와 같은 다른 언어 / 서비스 간의 다른 해시를 방지하는 것이 좋습니다 …

이 코드를 사용하지 않으면 NodeJS와 Python간에 다른 해시를 얻을 수 있습니다 …

Python, PHP, Perl, Github과 동일한 해시를 얻는 방법 (및 문제 방지) :

NodeJS는 문자열의 UTF-8 표현을 해시합니다. 파이썬, PHP 또는 PERL과 같은 다른 언어는 바이트 문자열을 해시합니다.

바이트 문자열을 사용하기 위해 이진 인수를 추가 할 수 있습니다 .

코드 :

const crypto = require("crypto");

function sha256(data) {
    return crypto.createHash("sha256").update(data, "binary").digest("base64");
    //                                               ------  binary: hash the byte string
}

sha256("string or binary");

선적 서류 비치:

  • crypto.createHash (algorithm [, options]) : 알고리즘은 플랫폼에서 OpenSSL 버전이 지원하는 사용 가능한 알고리즘에 따라 다릅니다.
  • hash.digest ([encoding]) : 인코딩은 ‘hex’, ‘latin1’또는 ‘base64’일 수 있습니다. (base 64는 더 길다).

sha256 ( “\ xac”), “\ xd1”, “\ xb9”, “\ xe2”, “\ xbb”, “\ x93″등의 문제가 발생할 수 있습니다.

  • 다른 언어 (예 : PHP, Python, Perl …) 및 내 솔루션 .update(data, "binary"):

    sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
  • 기본적으로 Nodejs (2 진 제외) :

    sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752

답변

crypto모듈은 매우 쉽게이 있습니다.

설정:

// import crypto from 'crypto';
const crypto = require('crypto');

const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');

용법:

sha256('Hello, world. ');


답변

여기서 node.js 버전이 지원하는 하드웨어에서 지원되는 모든 해시를 벤치마킹 할 수 있습니다. 일부는 암호화되어 있고 일부는 체크섬 전용입니다. 각 알고리즘에 대해 “Hello World”를 백만 번 계산합니다. 각 알고리즘마다 약 1-15 초가 소요될 수 있습니다 (Node.js 4.2.2를 사용하여 표준 Google Computing Engine에서 테스트).

for(var i1=0;i1<crypto.getHashes().length;i1++){
  var Algh=crypto.getHashes()[i1];
  console.time(Algh);
  for(var i2=0;i2<1000000;i2++){
    crypto.createHash(Algh).update("Hello World").digest("hex");
  }
  console.timeEnd(Algh);
}

결과 :
DSA : 1992ms
DSA-SHA : 1960ms
DSA-SHA1 : 2062ms
DSA-SHA1-old : 2124ms
RSA-MD4 : 1893ms
RSA-MD5 : 1982ms
RSA-MDC2 : 2797ms
RSA-RIPEMD160 : 2101ms
RSA-SHA : 1948ms
RSA-SHA1 : 1908ms
RSA-SHA1-2는 : 2042ms
RSA-SHA224을 : 2176ms
RSA-SHA256을 : 2158ms
RSA-SHA384 것은 : 2290ms
RSA-SHA512을 : 2357ms
dsaEncryption는 : 1936ms
dsaWithSHA하면 : 1910ms
dsaWithSHA1을 : 1926ms
DSS1 : 1928ms
ECDSA-와-SHA1 : 1880ms가
MD4 : 1833ms
MD4 사용 RSAE 암호화 : 1925ms
MD5 : 1863ms MD5
RSAE
암호화 사용 : 1923ms
mdc2 : 2729ms mdc2 RSA 사용 : 2890ms
RIPEMD : 2101ms
RIPEMD160 : 2153ms
ripemd160WithRSA : 2210ms
rmd160 : 2146ms
샤 : 1929ms
SHA1 : 1880ms
sha1WithRSAEncryption을 : 1957ms
SHA224 : 2121ms
sha224WithRSAEncryption : 2290ms
SHA256 : 2134ms
sha256WithRSAEncryption : 2190ms
SHA384 : 2181ms
sha384WithRSAEncryption : 2343ms
SHA512 : 2371ms
sha512WithRSAEncryption : 2434ms
shaWithRSAEncryption을 : 1966ms
ssl2- md5 : 1853ms
ssl3-md5 : 1868ms
ssl3-sha1 : 1971ms
소용돌이 : 2578ms


답변

간단한 원 라이너 :

UTF8 텍스트 해시를 원하는 경우 :

const hash = require('crypto').createHash('sha256').update('Hash me', 'utf8').digest('hex');

Python, PHP, Perl, Github와 동일한 해시를 얻으려면 :

const hash = require('crypto').createHash('sha256').update('Hash me', 'binary').digest('hex');

또한 대체 할 수 'sha256''sha1', 'md5', 'sha256','sha512'