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
'development' 카테고리의 다른 글
RecyclerView로 수평 ListView를 작성하는 방법은 무엇입니까? (0) | 2020.03.15 |
---|---|
Android Fragment 핸들 뒤로 버튼 누름 (0) | 2020.03.15 |
Vim에서 전체 라인을 위아래로 이동 (0) | 2020.03.15 |
설치 스크립트가 오류와 함께 종료되었습니다 : 'x86_64-linux-gnu-gcc'명령이 종료 상태 1로 실패했습니다. (0) | 2020.03.15 |
정수가 다른 두 정수 사이에 있는지 확인 (0) | 2020.03.15 |