node.js 해시 문자열?


답변:


224

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);
});

s.on () 함수는 무엇을하고 있습니까? ReadStream에서 데이터를 읽을 때마다 실행되도록 md5sum.update (d) 함수를 등록합니까?
DucRP

@YoniDor fs.readsync를 사용해 보셨습니까 ? - 소화 고전 동안 루프에서 다음 확인이 이루어집니다일지도 ... ➝ stackoverflow.com/a/21219407/444255
프랭크 Nocke

8
OP는 파일이 아닌 문자열을 해시하려고합니다.
소형 연식 비행선

699

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

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

181
Woot woot, 만약 당신이 require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")하나의 라이너를 가지고 있다면 . 힘내 친구 야!
balupton

3
해시 객체가 매번 다시 만들어지기 때문에 하나의 라이너를 사용하여 솔루션 을 사용하려고 할 때 .update여러 번 ( github.com/joyent/node/issues/749 ) 몇 가지 문제가 발생 timbooo했습니다.
Max

문자열의 길이를 변경하는 방법은 무엇입니까? 32 자, 64 또는 128 또는 다른 숫자 만 사용할 수 있습니다.
Mikel

@Mikel 귀하의 요구에 맞는 다른 해시 알고리즘이 있으면 md5는 항상 32 자입니다.
넥타이

해시 할 문자열이 많으면 결과를 재사용하는 대신 crypto.createHash를 계속 호출하는 것이 덜 효율적입니까?
Michael

81

노드의 암호화 모듈 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는 변경되지 않습니다!


9
완전히 새로운 모듈을 가져 오는 것보다 Crypto를 사용하는 것이 훨씬 쉽고 효율적이라고 생각합니다.
Valjas

6
현재 Node.js 문서에서 : "안정성 : 2-불안정; 향후 버전에 대한 API 변경 사항에 대해 논의 중입니다. 주요 변경 내용이 최소화됩니다." 내 모듈의 API는 변경되지 않습니다. 처음에 모듈을 작성할 때 플랫폼에 내장 된 모듈 이 없었습니다 crypto . 또 다른 장점은 클라이언트 측뿐만 아니라 서버에서도 내 모듈을 사용할 수 있다는 것입니다. 그러나 사용하는 라이브러리는 전적으로 귀하에게 달려 있습니다.
pvorb

7
Crypto 해시의 빌드는 '해시 업데이트 실패'BS를 계속 제공했습니다. 마지막으로 MD5 모듈로 옮겼으며 정상적으로 작동했습니다. (약간) 전화하기도 쉽습니다. 감사합니다.
GJK

2
Crypto API의 (2)-불안정한 특성에서 벗어나는 옵션의 경우 +1!
Geek Stocks

1
이 모듈의 표준 암호화 사용을 교체하여 Windows 컴퓨터의 노드 0.11.x에서 이상한 sha1 문제를 해결했습니다.
Bartvds

24
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

15

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

설정:

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

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

용법:

sha256('Hello, world. ');

10

여기서 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


1
뭐라고합니까 RSA-접두사는 무엇입니까?
balupton

7

간단한 원 라이너 :

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'


1

http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ 의 생각을 고려하면 (즉, FIRST 암호화, THEN 인증. 그 후 FIRST 확인, THEN 해독) 노드에서 다음 솔루션을 구현했습니다. js :

function encrypt(text,password){
  var cipher = crypto.createCipher(algorithm,password)
  var crypted = cipher.update(text,'utf8','hex')
  crypted += cipher.final('hex');
  return crypted;
}

function decrypt(text,password){
  var decipher = crypto.createDecipher(algorithm,password)
  var dec = decipher.update(text,'hex','utf8')
  dec += decipher.final('utf8');
  return dec;
}

function hashText(text){
    var hash = crypto.createHash('md5').update(text).digest("hex");
    //console.log(hash); 
    return hash;
}

function encryptThenAuthenticate(plainText,pw)
{
    var encryptedText = encrypt(plainText,pw);
    var hash = hashText(encryptedText);
    return encryptedText+"$"+hash;
}
function VerifyThenDecrypt(encryptedAndAuthenticatedText,pw)
{
    var encryptedAndHashArray = encryptedAndAuthenticatedText.split("$");
    var encrypted = encryptedAndHashArray[0];
    var hash = encryptedAndHashArray[1];
    var hash2Compare = hashText(encrypted);
    if (hash === hash2Compare)
    {
        return decrypt(encrypted,pw); 
    }
}

다음과 같이 테스트 할 수 있습니다.

var doom = encryptThenAuthenticate("The encrypted text",user.cryptoPassword);
console.log(VerifyThenDecrypt(doom,user.cryptoPassword));

도움이 되었기를 바랍니다 :-)


1

"Node.js와 같은 서버 측 환경, RequireJS, Browserify 또는 webpack과 같은 모듈 로더 및 모든 웹 브라우저와 호환되는 blueimp-md5 를 사용 합니다."

다음과 같이 사용하십시오.

var md5 = require("blueimp-md5");

var myHashedString = createHash('GreensterRox');

createHash(myString){
    return md5(myString);
}

열린 곳에서 해시 된 값을 전달하면 사람들이 값을 다시 만들기가 더 어려워 지도록 항상 소금을 바르는 것이 좋습니다.

createHash(myString){
    var salt = 'HnasBzbxH9';
    return md5(myString+salt);
}

1
function md5(a) {
    var r = 0,
        c = "";
    return h(a);

    function h(t) {
        return u(l(m(t)))
    }

    function l(t) {
        return p(g(f(t), 8 * t.length))
    }

    function u(t) {
        for (var e, i = r ? "0123456789ABCDEF" : "0123456789abcdef", n = "", o = 0; o < t.length; o++)
            e = t.charCodeAt(o),
            n += i.charAt(e >>> 4 & 15) + i.charAt(15 & e);
        return n
    }

    function m(t) {
        for (var e, i, n = "", o = -1; ++o < t.length;)
            e = t.charCodeAt(o),
            i = o + 1 < t.length ? t.charCodeAt(o + 1) : 0,
            55296 <= e && e <= 56319 && 56320 <= i && i <= 57343 && (e = 65536 + ((1023 & e) << 10) + (1023 & i),
                o++),
            e <= 127 ? n += String.fromCharCode(e) : e <= 2047 ? n += String.fromCharCode(192 | e >>> 6 & 31, 128 | 63 & e) : e <= 65535 ? n += String.fromCharCode(224 | e >>> 12 & 15, 128 | e >>> 6 & 63, 128 | 63 & e) : e <= 2097151 && (n += String.fromCharCode(240 | e >>> 18 & 7, 128 | e >>> 12 & 63, 128 | e >>> 6 & 63, 128 | 63 & e));
        return n
    }

    function f(t) {
        for (var e = Array(t.length >> 2), i = 0; i < e.length; i++)
            e[i] = 0;
        for (i = 0; i < 8 * t.length; i += 8)
            e[i >> 5] |= (255 & t.charCodeAt(i / 8)) << i % 32;
        return e
    }

    function p(t) {
        for (var e = "", i = 0; i < 32 * t.length; i += 8)
            e += String.fromCharCode(t[i >> 5] >>> i % 32 & 255);
        return e
    }

    function g(t, e) {
        t[e >> 5] |= 128 << e % 32,
            t[14 + (e + 64 >>> 9 << 4)] = e;
        for (var i = 1732584193, n = -271733879, o = -1732584194, s = 271733878, a = 0; a < t.length; a += 16) {
            var r = i,
                c = n,
                h = o,
                l = s;
            n = E(n = E(n = E(n = E(n = N(n = N(n = N(n = N(n = C(n = C(n = C(n = C(n = S(n = S(n = S(n = S(n, o = S(o, s = S(s, i = S(i, n, o, s, t[a + 0], 7, -680876936), n, o, t[a + 1], 12, -389564586), i, n, t[a + 2], 17, 606105819), s, i, t[a + 3], 22, -1044525330), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 4], 7, -176418897), n, o, t[a + 5], 12, 1200080426), i, n, t[a + 6], 17, -1473231341), s, i, t[a + 7], 22, -45705983), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 8], 7, 1770035416), n, o, t[a + 9], 12, -1958414417), i, n, t[a + 10], 17, -42063), s, i, t[a + 11], 22, -1990404162), o = S(o, s = S(s, i = S(i, n, o, s, t[a + 12], 7, 1804603682), n, o, t[a + 13], 12, -40341101), i, n, t[a + 14], 17, -1502002290), s, i, t[a + 15], 22, 1236535329), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 1], 5, -165796510), n, o, t[a + 6], 9, -1069501632), i, n, t[a + 11], 14, 643717713), s, i, t[a + 0], 20, -373897302), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 5], 5, -701558691), n, o, t[a + 10], 9, 38016083), i, n, t[a + 15], 14, -660478335), s, i, t[a + 4], 20, -405537848), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 9], 5, 568446438), n, o, t[a + 14], 9, -1019803690), i, n, t[a + 3], 14, -187363961), s, i, t[a + 8], 20, 1163531501), o = C(o, s = C(s, i = C(i, n, o, s, t[a + 13], 5, -1444681467), n, o, t[a + 2], 9, -51403784), i, n, t[a + 7], 14, 1735328473), s, i, t[a + 12], 20, -1926607734), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 5], 4, -378558), n, o, t[a + 8], 11, -2022574463), i, n, t[a + 11], 16, 1839030562), s, i, t[a + 14], 23, -35309556), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 1], 4, -1530992060), n, o, t[a + 4], 11, 1272893353), i, n, t[a + 7], 16, -155497632), s, i, t[a + 10], 23, -1094730640), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 13], 4, 681279174), n, o, t[a + 0], 11, -358537222), i, n, t[a + 3], 16, -722521979), s, i, t[a + 6], 23, 76029189), o = N(o, s = N(s, i = N(i, n, o, s, t[a + 9], 4, -640364487), n, o, t[a + 12], 11, -421815835), i, n, t[a + 15], 16, 530742520), s, i, t[a + 2], 23, -995338651), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 0], 6, -198630844), n, o, t[a + 7], 10, 1126891415), i, n, t[a + 14], 15, -1416354905), s, i, t[a + 5], 21, -57434055), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 12], 6, 1700485571), n, o, t[a + 3], 10, -1894986606), i, n, t[a + 10], 15, -1051523), s, i, t[a + 1], 21, -2054922799), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 8], 6, 1873313359), n, o, t[a + 15], 10, -30611744), i, n, t[a + 6], 15, -1560198380), s, i, t[a + 13], 21, 1309151649), o = E(o, s = E(s, i = E(i, n, o, s, t[a + 4], 6, -145523070), n, o, t[a + 11], 10, -1120210379), i, n, t[a + 2], 15, 718787259), s, i, t[a + 9], 21, -343485551),
                i = v(i, r),
                n = v(n, c),
                o = v(o, h),
                s = v(s, l)
        }
        return [i, n, o, s]
    }

    function _(t, e, i, n, o, s) {
        return v((a = v(v(e, t), v(n, s))) << (r = o) | a >>> 32 - r, i);
        var a, r
    }

    function S(t, e, i, n, o, s, a) {
        return _(e & i | ~e & n, t, e, o, s, a)
    }

    function C(t, e, i, n, o, s, a) {
        return _(e & n | i & ~n, t, e, o, s, a)
    }

    function N(t, e, i, n, o, s, a) {
        return _(e ^ i ^ n, t, e, o, s, a)
    }

    function E(t, e, i, n, o, s, a) {
        return _(i ^ (e | ~n), t, e, o, s, a)
    }

    function v(t, e) {
        var i = (65535 & t) + (65535 & e);
        return (t >> 16) + (e >> 16) + (i >> 16) << 16 | 65535 & i
    }
}
string = 'hello';
console.log(md5(string));

-1

해시가 보안 용이 아닌 경우에도 md5 대신 sha를 사용할 수 있습니다. 내 의견으로는 사람들은 md5를 잊어야한다고 생각합니다. 과거에는 과거입니다!

일반적인 nodejs sha256은 더 이상 사용되지 않습니다. 따라서 현재 두 가지 대안이 있습니다.

var shajs = require('sha.js')  - https://www.npmjs.com/package/sha.js (used by Browserify)

var hash = require('hash.js')  - https://github.com/indutny/hash.js

sha shajs대신 hash요즘 최고의 해시 함수를 고려하고 지금은 다른 해시 함수가 필요하지 않기 때문에 대신을 사용 하는 것이 좋습니다. 따라서 16 진수로 해시를 얻으려면 다음과 같이해야합니다.

sha256.update('hello').digest('hex')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.