回答:
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表現をハッシュしています。他の言語(Python、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(バイナリなし):
sha1("\xac") //f50eb35d94f1d75480496e54f4b4a472a9148752
ここでは、使用しているバージョンのnode.jsでサポートされている、ハードウェアでサポートされているすべてのハッシュをベンチマークできます。暗号化されているものもあれば、チェックサムのためだけのものもあります。各アルゴリズムで「Hello World」を100万回計算しています。アルゴリズムごとに約1〜15秒かかる場合があります(Node.js 4.2.2を使用した標準のGoogleコンピューティングエンジンでテスト済み)。
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-with-SHA1
: 1833ms
md4WithRSAEncryption:1925ms
md5:1863ms
md5WithRSAEncryption:1923ms
mdc2:2729ms
mdc2WithRSA:2890ms
ripemd:2101ms
ripemd160:2153ms
ripemd160WithRSA:2210ms
rmd160:2146ms
sha:1929ms
sha1:1880ms
sha1WithRSAEncryption:1957ms
sha224:2121ms
sha224WithRSAEncryption:2290ms
sha256:2msmsShaion:2134ms
shaion:2msms3842Enms
sha384:Enms
sha384:Enms
sha384:Enms
sha384:Enms
sha384:Enms
sha3842 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/ (簡単に言うと、最初に暗号化してから認証します。その後、最初に確認してから解読します)の考えを考慮して 、ノードに次のソリューションを実装しました。 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));
お役に立てれば :-)
私はblueimp-md5を使用していますは「Node.jsなどのサーバー側環境、RequireJS、Browserifyまたはwebpackなどのモジュールローダー、およびすべてのWebブラウザーと互換性があります」であるます。
次のように使用します。
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は非推奨です。したがって、今のところ2つの選択肢があります。
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
のshajs
代わりにを使用するhash
ことをお勧めします。なぜなら、私は今日、shaが最良のハッシュ関数であると考えており、今のところ別のハッシュ関数は必要ないからです。したがって、16進数でハッシュを取得するには、次のようにする必要があります。
sha256.update('hello').digest('hex')