development

node.js 해시 문자열?

big-blog 2020. 3. 15. 09:37
반응형

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모듈은 매우 쉽게이 있습니다.

설정:

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
RSA
암호화 사용 : 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


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

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


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

해시가 보안 용이 아닌 경우에도 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')

참고 URL : https://stackoverflow.com/questions/5878682/node-js-hash-string

반응형