답변:
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
require('crypto').createHash('md5').update(STRING_TO_BE_HASHED).digest("hex")
하나의 라이너를 가지고 있다면 . 힘내 친구 야!
.update
여러 번 ( github.com/joyent/node/issues/749 ) 몇 가지 문제가 발생 timbooo
했습니다.
노드의 암호화 모듈 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는 변경되지 않습니다!
crypto
. 또 다른 장점은 클라이언트 측뿐만 아니라 서버에서도 내 모듈을 사용할 수 있다는 것입니다. 그러나 사용하는 라이브러리는 전적으로 귀하에게 달려 있습니다.
sha256("string or binary");
다른 답변에 문제가 발생했습니다. 인코딩 인수를로 설정하는 것이 좋습니다.binary
바이트 문자열을 사용하도록 하고 Javascript (NodeJS)와 Python, PHP, Github와 같은 다른 언어 / 서비스 간의 다른 해시를 방지하는 것이 좋습니다 ...
이 코드를 사용하지 않으면 NodeJS와 Python간에 다른 해시를 얻을 수 있습니다 ...
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");
선적 서류 비치:
sha256 ( "\ xac"), "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93"등의 문제가 발생할 수 있습니다.
다른 언어 (예 : PHP, Python, Perl ...) 및 내 솔루션 .update(data, "binary")
:
sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
기본적으로 Nodejs (2 진 제외) :
sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
여기서 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
RSA-
접두사는 무엇입니까?
간단한 원 라이너 :
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'
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);
}
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));
해시가 보안 용이 아닌 경우에도 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')