আমি কীভাবে নোড.জেজে স্ট্রিংয়ের শ 1 হ্যাশ পেতে পারি?


108

আমি নোড.জেজে লেখা একটি ওয়েবসকেট সার্ভার তৈরি করার চেষ্টা করছি

সার্ভারটি কাজ করার জন্য আমার একটি স্ট্রিংয়ের SHA1 হ্যাশ পাওয়া দরকার।

আমাকে যা করতে হবে তা ডক্সের 5.2.2 পৃষ্ঠা 35-এ ব্যাখ্যা করা হয়েছে ।

দ্রষ্টব্য: উদাহরণ হিসাবে, "Sec-WebSocket-Key" ক্লায়েন্টের হ্যান্ডশেকের শিরোনামের মানটি থাকলে "dGhlIHNhbXBsZSBub25jZQ=="সার্ভারটি "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"স্ট্রিং গঠনের জন্য স্ট্রিং যুক্ত করে would"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" । সার্ভার তারপরে এই স্ট্রিংয়ের SHA-1 হ্যাশ নেবে, 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea। এই মানটি তখন বেস 64-এনকোডড হয় "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", মান দিতে , যা "Sec-WebSocket-Accept"শিরোনামে ফিরে আসবে ।


9
আমি চাই অত্যন্ত চমৎকার ব্যবহার করার প্রস্তাব socket.io গ্রন্থাগার পরিবর্তে আপনার নিজের ঘূর্ণায়মান। এটি কেবলমাত্র ব্যাপকভাবে পরীক্ষিত এবং প্যাচ করা হয়নি, তবে এটি বিভিন্ন পদ্ধতির মাধ্যমে বেশিরভাগ ব্রাউজারগুলিকে (ওয়েবস্কট এপিআই ছাড়াই ইভেন্টগুলি) সমর্থন করে।
অ্যালেক্স টারপিন

1
ভবিষ্যতের দর্শনার্থীদের জন্য একটি ভাল রেফারেন্স: স্ট্যাকওভারফ্লো.com
দামোদরনের

উত্তর:



32

বাধ্যতামূলক: SHA1 টি ভাঙা হয়েছে , আপনি 45,000 মার্কিন ডলারে SHA1 সংঘর্ষ গণনা করতে পারেন । আপনার ব্যবহার করা উচিত sha256:

var getSHA256ofJSON = function(input){
    return crypto.createHash('sha256').update(JSON.stringify(input)).digest('hex')
}

আপনার প্রশ্নের উত্তর দিতে এবং একটি SHA1 হ্যাশ তৈরি করতে:

const INSECURE_ALGORITHM = 'sha1'
var getInsecureSHA1ofJSON = function(input){
    return crypto.createHash(INSECURE_ALGORITHM).update(JSON.stringify(input)).digest('hex')
}

তারপর:

getSHA256ofJSON('whatever')

অথবা

getSHA256ofJSON(['whatever'])

অথবা

getSHA256ofJSON({'this':'too'})

অফিসিয়াল নোড ডক্স চালু আছে crypto.createHash()


7
ভাল ধারণা. নোট করুন, তবে, ডিফল্টরূপে Object.toString()ফেরত দেওয়ার পরে সমস্ত বস্তুর (অ্যারে এবং নাল ব্যতীত) একই শ 1 স্যাম মান থাকবে [object Object]। সুতরাং sha1sum({})=== sha1sum({"foo":"bar"})=== sha1sum({"a":1}), ইত্যাদি
maerics

sha1 (JSON.stringify ("কিছু স্ট্রিং")) => sha1 ("\" কিছু স্ট্রিং \ "") যা একেবারে প্রত্যাশিত নয় এবং ক্রস প্ল্যাটফর্ম নয়। কখনও কখনও ভাল ভাল শত্রু হয়।
পিয়েরে

3
প্রদত্ত স্ট্রিংয়ের sha1 কোনও প্ল্যাটফর্মে একই হবে বলে আশা করা হচ্ছে। ব্যবহার JSON.stringify মূল STRING এবং sha1sum ( "ABCD") পরিবর্তনের হলে আপনার বাস্তবায়ন দেয় f805c8fb0d5c466362ce9f0dc798bd5b3b32d512 যেখানে যে কেউ 81fe8bfe87576c3ecb22426f8e57847382917acf আশা
পিয়ের

2
@ পিয়ার এটি একটি দুর্দান্ত বিষয়। আমি মনে করি ফাংশনটির নামকরণ যা sha1sumবলেছেন তা প্রদত্তকে ভুল বলেছে - এটি সাধারণ শ 1 এর চেয়ে স্পষ্টতই বেশি কাজ করে। আমি উত্তরে ফাংশনটির নামকরণ করেছি।
মাইকম্যাকানা

সেখানে মান 80 বৃত্তাকার রয়েছে SHA-1 অনুযায়ী আজ কোন পরিচিত সংঘর্ষের হিসাবে stackoverflow.com/a/3476791/1236215
kzahel

8

আপনার পোস্টের মন্তব্যে দয়া করে আমার পরামর্শটি পড়ুন এবং দৃ strongly়তার সাথে বিবেচনা করুন। বলা হচ্ছে, যদি আপনার এখনও এটি করার ভাল কারণ থাকে তবে নোডের জন্য ক্রিপ্টো মডিউলগুলির এই তালিকাটি দেখুন । এটি sha1 এবং বেস 64 উভয়ের সাথে ডিল করার জন্য মডিউল রয়েছে।


7

সমস্যা (খারাপ হ্যাশ) প্রতিরোধের টিপস:

আমি অভিজ্ঞতা পেয়েছি যে নোডজেএস স্ট্রিংয়ের ইউটিএফ -8 প্রতিনিধিত্ব করছে। অন্যান্য ভাষা (যেমন পাইথন, পিএইচপি বা পিইআরএল ...) বাইট স্ট্রিংটি হ্যাশ করছে।

বাইট স্ট্রিংটি ব্যবহার করতে আমরা বাইনারি যুক্তি যুক্ত করতে পারি ।

const crypto = require("crypto");

function sha1(data) {
    return crypto.createHash("sha1").update(data, "binary").digest("hex");
}

sha1("Your text ;)");

আপনি এখানে চেষ্টা করতে পারেন: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", ইত্যাদি ...

অন্যান্য ভাষা (পাইথন, পিএইচপি, ...):

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

Nodejs:

sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752


1
@ সেখানে @ জোসেফহারুশের অত্যন্ত গুরুত্বপূর্ণ মন্তব্য! হ্যাশ করার আগে যদি আপনাকে বিশেষত পাঠ্যটি ল্যাটিন 1 হিসাবে এনকোড করার প্রয়োজন না হয় (যেমন পিএইচপি-র সাথে সামঞ্জস্যের জন্য) এবং আপনার পাঠ্যটিতে লাতিন 1 ব্যাপ্তির (যেমন ইমোজি!) বাইরে ইউনিকোড চিহ্ন রয়েছে এমন কোনও সুযোগ নেই binary! এনকোডিং ব্যবহার binaryবা ব্যবহার করা তথ্য হারাবে এবং সংঘর্ষের সম্ভাবনা বাড়বে! : যেমন এই দুটি সাথে উপরে স্নিপেট চেষ্টা করুন এবংlatin1
CBR

সমস্ত হ্যাশগুলি বাইনারি ডেটাতে করা হয়। আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল আপনি উল্লিখিত অন্যান্য ভাষাগুলি ইউটিএফ -8 ব্যবহার করছে না, অন্যভাবে নয়। আপনি ল্যাটিন 1 এর বাইরের কিছু হ্যাশ করার চেষ্টা করলে এটি খুব প্রকট হয়ে উঠবে। বিশেষত পিএইচপি-র ক্ষেত্রে, এনকোডিংটি উত্স দ্বারা সম্পূর্ণরূপে নির্ধারিত হয়, যেমন হার্ড-কোডেড পাঠ্যের জন্য নিজেই টেক্সট ফাইল। ইউটিএফ -8 ব্যবহার করার জন্য পার্লকে কিছু ভারী উত্তোলনের প্রয়োজন হতে পারে।
রায়ান হানেক্যাম্প

3

তুমি ব্যবহার করতে পার:

  const sha1 = require('sha1');
  const crypt = sha1('Text');
  console.log(crypt);

ইনস্টলের জন্য:

  sudo npm install -g sha1
  npm install sha1 --save

হাই ইউজার944550, স্বাগতম। আরও তথ্য যুক্ত বিবেচনা করুন।
টিয়াগো মার্টিনস পেরেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.