ハッシュしたい文字列があります。 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");
私は他の答えで問題を経験しました。バイト文字列を使用し、Javascript(NodeJS)と他の言語/サービス(Python、PHP、Githubなど)との間で異なるハッシュが発生しないように、エンコード引数をbinary
に設定することをお勧めします。
このコードを使わなければ、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
crypto
モジュールはこれをとても簡単にします。
セットアップ:
const crypto = require('crypto');
const sha256 = x => crypto.createHash('sha256').update(x, 'utf8').digest('hex');
使用法:
sha256('Hello, world. ');
ここであなたの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:1992ミリ秒
DSA-SHA:1960ミリ秒
DSA-SHA1:2062ms
DSA-SHA1-old:2124ms
RSA-MD4:1893ms
RSA-MD5:1982ms
RSA-MDC2:2797ms
RSA-RIPEMD 160:2101ms
RSA-SHA:1948ミリ秒
RSA-SHA1:1908ms
RSA-SHA1-2:2042ms
RSA-SHA224:2176ms
RSA-SHA256:2158ms
RSA-SHA384:2290ms
RSA-SHA512:2357ms
dsa暗号化:1936ms
dsaWithSHA:1910ミリ秒
dsaWithSHA1:1926ms
dss1:1928ms
ecdsa-with-SHA1:1880ミリ秒
md4:1833ms
md4WithRSA暗号化:1925ミリ秒
md5:1863ms
md5WithRSA暗号化:1923ms
mdc2:2729ms
mdc2WithRSA:2890ms
ripemd:2101ms
ripemd160:2153ms
ripemd160WithRSA:2210ms
rmd160:2146ms
sha:1929ms
sha1:1880ms
sha1WithRSA暗号化:1957ms
sha224:2121ms
sha224WithRSA暗号化:2290ms
sha256:2134ms
sha256WithRSA暗号化:2190ms
sha384:2181ms
sha384WithRSA暗号化:2343ms
sha512:2371ms
sha512WithRSA暗号化:2434ms
shaWithRSA暗号化:1966ms
ssl2-md5:1853ms
ssl3-md5:1868ms
ssl3-sha1:1971ms
ワールプール:2578ms
私は 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);
}
http://www.thoughtcrime.org/blog/the-cryptographic-Doom-principle/ (つまり、最初に暗号化し、次に認証します。その後、最初に検証し、次に復号します) node.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));
お役に立てれば :-)
ハッシュがセキュリティ用ではない場合でも、md5の代わりにshaを使用できます。私の意見では、人々は今のところmd5を忘れるべきです、それは過去のものです!
通常のnodejs sha256は非推奨です。したがって、今のところ2つの選択肢があります。
var shajs = require('sha.js')
- https://www.npmjs.com/package/sha.js (Browserifyで使用)
var hash = require('hash.js')
- https://github.com/indutny/hash.js
私は最近shaを最高のハッシュ関数と考えており、今のところ別のハッシュ関数は必要ないので、shajs
の代わりにhash
を使用することを推奨します。したがって、16進数でハッシュを取得するには、次のような操作を行う必要があります:sha256.update('hello').digest('hex')
。