Node.js এ এলোমেলো টোকেন সুরক্ষিত করুন


273

ইন এই প্রশ্নের এরিক Node.js. মধ্যে একটি নিরাপদ র্যান্ডম টোকেন জেনারেট করার প্রয়োজন এমন একটি পদ্ধতি রয়েছে crypto.randomBytesযা একটি এলোমেলো বাফার উত্পন্ন করে। যাইহোক, নোডের মধ্যে করুন Base64- এনকোডিং, URL-নিরাপদ নয় এটা অন্তর্ভুক্ত /এবং +পরিবর্তে -এবং _। অতএব, আমি খুঁজে পেয়েছি এমন টোকেন উত্পন্ন করার সহজতম উপায় হ'ল

require('crypto').randomBytes(48, function(ex, buf) {
    token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
});

আরও কি মার্জিত উপায় আছে?


কোড বাকি কি?
সিংহ 789

3
এর চেয়ে বেশি আর দরকার নেই। আপনি আর কি দেখতে চান?
হুবার্ট ওজি

কিছুই নয়, আমি এটি কাজ করতে পেরেছি, আপনি কীভাবে এটি ছুঁড়ে ফেলেছিলেন তা সম্পর্কে কেবল অনিশ্চিত ছিল, তবে ধারণাটি আরও ভালভাবে উপলব্ধি করতে পেরেছিলেন
Lion789

1
নির্লজ্জ স্ব-প্লাগ, আমি আরও একটি এনপিএম প্যাকেজ তৈরি করেছি: টোকজেন । আপনি নিয়মিত এক্সপ্রেশন ( 'a-zA-Z0-9_-') এর অক্ষর শ্রেণীর অনুরূপ একটি রেঞ্জ সিনট্যাক্স ব্যবহার করে অনুমোদিত অক্ষরগুলি নির্দিষ্ট করতে পারেন ।
ম্যাক্স ট্রুকসা

1
এটি নির্দিষ্ট স্ট্রিং দৈর্ঘ্য যারা পছন্দ করেন তাদের পক্ষে এটি সুবিধাজনক হতে পারে। 3/4 এর বেসটি রূপান্তরটি পরিচালনা করা। / * দৈর্ঘ্যের একটি বেস 64 এনকোড স্ট্রিং প্রদান করে * / ফাংশন এলোমেলো স্ট্রিং (দৈর্ঘ্য) cry রিটার্ন ক্রাইপটো.আরন্ডমবাইটস (দৈর্ঘ্য * 3/4)। স্ট্রিং ('বেস64'); Character সেই অক্ষর সীমা সহ সেই ডাটাবেসের জন্য দুর্দান্ত কাজ করে।
দ্য অজ্ঞাত গীক 21

উত্তর:


353

ব্যবহার করে দেখুন crypto.randomBytes) ( :

require('crypto').randomBytes(48, function(err, buffer) {
  var token = buffer.toString('hex');
});

'হেক্স' এনকোডিং নোড v0.6.x বা আরও নতুনতে কাজ করে।


3
এটি আরও ভাল মনে হয়, ধন্যবাদ! যদিও একটি 'বেস 64-url' এনকোডিংটি দুর্দান্ত হবে।
হুবার্ট ওজি

2
টিপটির জন্য ধন্যবাদ, তবে আমি মনে করি যে ওপি কেবল ইতিমধ্যে স্ট্যান্ডার্ড আরএফসি 3548 বিভাগ 4 "ইউএসএল এবং ফাইল নাম নিরাপদ বর্ণমালা দিয়ে বেস 64 এনকোডিং" চেয়েছিল। আইএমও, অক্ষরগুলি প্রতিস্থাপন করা "যথেষ্ট যথেষ্ট মার্জিত"।
natevw

8
আপনি যদি উপরের দিকে বাশ ওয়ান-লাইনার হিসাবে সন্ধান করছেন তবে আপনি এটি করতে পারেনnode -e "require('crypto').randomBytes(48, function(ex, buf) { console.log(buf.toString('hex')) });"
দিমিত্রি মিনকভস্কি

24
এবং আপনি সবসময় buf.toString('base64')একটি বেস 64-এনকোড নম্বর পেতে করতে পারেন ।
দিমিত্রি মিনকভস্কি

1
ইউআরএল এবং ফাইল নাম নিরাপদ বর্ণমালা সহ বেস 64 এনকোডিংয়ের জন্য নীচে এই উত্তরটি দেখুন
ইয়ভেস এম

232

আপনি যদি আমার মতো জেএস বিশেষজ্ঞ না হন তবে সিঙ্ক্রোনাস বিকল্প। ইনলাইন ফাংশন ভেরিয়েবলটি কীভাবে অ্যাক্সেস করতে হয় তার জন্য কিছুটা সময় ব্যয় করতে হয়েছিল

var token = crypto.randomBytes(64).toString('hex');

7
এছাড়াও যদি আপনি সমস্ত কিছু নেস্টেড করতে চান না। ধন্যবাদ!
মাইকেল ওজেরিয়ানস্কি

2
এটি অবশ্যই কার্যকরভাবে কাজ করার সময়, নোট করুন যে বেশিরভাগ ক্ষেত্রে আপনি ashnc বিকল্পটি jhh এর উত্তরে প্রদর্শিত হবে।
ট্রাইফোর্সি

1
const generateToken = (): Promise<string> => new Promise(resolve => randomBytes(48, (err, buffer) => resolve(buffer.toString('hex'))));
ইয়ন্ত্রব

1
@ ট্রাইফোর্সী আপনি ব্যাখ্যা করতে পারেন যে আপনি সাধারণত অ্যাসিঙ্ক বিকল্পটি চান কেন?
থোমাস

2
@ থমাস র্যান্ডম ডেটা হার্ডওয়ারের উপর নির্ভর করে গণনা করতে কিছুটা সময় নিতে পারে। কিছু ক্ষেত্রে যদি কম্পিউটারটি এলোমেলো ডেটা না চালিয়ে যায় তবে এটি ঠিক তার জায়গায় কিছু ফিরিয়ে দেবে। তবে অন্যান্য ক্ষেত্রে এটি সম্ভব হয়েছে কম্পিউটারটি এলোমেলো ডেটা (যা আসলে যা আপনি চান) ফিরে আসতে বিলম্ব করবে যার ফলে ধীর কল হয়।
ট্রিফোর্সি

80

0. ন্যানয়েড তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করুন [নতুন!]

জাভাস্ক্রিপ্টের জন্য একটি ক্ষুদ্র, সুরক্ষিত, ইউআরএল-বান্ধব, অনন্য স্ট্রিং আইডি জেনারেটর

https://github.com/ai/nanoid

import { nanoid } from "nanoid";
const id = nanoid(48);


1. বেস URL৪ ইউআরএল এবং ফাইল নাম নিরাপদ বর্ণমালা দিয়ে এনকোডিং

আরসিএফ 4648 এর 7 পৃষ্ঠায় URL সুরক্ষার সাথে বেস 64 এ কীভাবে এনকোড করা যায় তা বর্ণনা করা হয়। কাজটি করতে আপনি বেস 64url এর মতো একটি বিদ্যমান লাইব্রেরি ব্যবহার করতে পারেন ।

ফাংশনটি হ'ল:

var crypto = require('crypto');
var base64url = require('base64url');

/** Sync */
function randomStringAsBase64Url(size) {
  return base64url(crypto.randomBytes(size));
}

ব্যবহারের উদাহরণ:

randomStringAsBase64Url(20);
// Returns 'AXSGpLVjne_f7w5Xg-fWdoBwbfs' which is 27 characters length.

নোট করুন যে ফিরে আসা স্ট্রিংয়ের দৈর্ঘ্য আকারের যুক্তির সাথে মিলবে না (আকার! = চূড়ান্ত দৈর্ঘ্য)।


২. ক্রিপ্টো র্যান্ডম মানগুলি সীমিত অক্ষরের সেট থেকে

সাবধান হন যে এই সমাধানের সাহায্যে উত্পন্ন এলোমেলো স্ট্রিংটি সমানভাবে বিতরণ করা হয়নি।

আপনি এর মতো সীমিত অক্ষরের সেট থেকে একটি শক্তিশালী এলোমেলো স্ট্রিং তৈরি করতে পারেন:

var crypto = require('crypto');

/** Sync */
function randomString(length, chars) {
  if (!chars) {
    throw new Error('Argument \'chars\' is undefined');
  }

  var charsLength = chars.length;
  if (charsLength > 256) {
    throw new Error('Argument \'chars\' should not have more than 256 characters'
      + ', otherwise unpredictability will be broken');
  }

  var randomBytes = crypto.randomBytes(length);
  var result = new Array(length);

  var cursor = 0;
  for (var i = 0; i < length; i++) {
    cursor += randomBytes[i];
    result[i] = chars[cursor % charsLength];
  }

  return result.join('');
}

/** Sync */
function randomAsciiString(length) {
  return randomString(length,
    'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
}

ব্যবহারের উদাহরণ:

randomAsciiString(20);
// Returns 'rmRptK5niTSey7NlDk5y' which is 20 characters length.

randomString(20, 'ABCDEFG');
// Returns 'CCBAAGDGBBEGBDBECDCE' which is 20 characters length.

2
@ লেক্সিনাক্স সলিউশন 1 (ইউআরএল এবং ফাইলের নাম নিরাপদ বর্ণমালার সাথে বেস 64 এনকোডিং) কারণ এটি সুরক্ষার ক্ষেত্রে সবচেয়ে শক্তিশালী সমাধান। এই সমাধানটি কেবল কীটি এনকোড করে এবং কী উত্পাদন প্রক্রিয়াটিতে হস্তক্ষেপ করে না।
ইয়ভেস এম।

তোমার সহযোগিতার জন্যে ধন্যবাদ. আপনার কাছে সম্প্রদায়ের সাথে ভাগ করে নেওয়ার মতো কোনও কাজের উদাহরণ রয়েছে? এটা স্বাগত জানানো হবে?
alexventuraio

6
সাবধান যে উত্পন্ন এলোমেলো স্ট্রিংটি সমানভাবে বিতরণ করা হয়নি। এটি দেখানোর একটি সহজ উদাহরণ হ'ল 255 দৈর্ঘ্যের একটি অক্ষর সেট এবং 1 টির দৈর্ঘ্যের জন্য, প্রথম চরিত্রের উপস্থিতির সুযোগ দ্বিগুণ হয়ে যায়।
ফ্লোরিয়ান ওয়েনডেলবোন

@Dodekeract হ্যাঁ, আপনি সমাধান 2 সম্পর্কে কথা বলছেন .. এই কারণেই সমাধান 1 আরও বেশি শক্তিশালী
ইয়ভেস এম

আমি আমার প্রতিক্রিয়ায় ন্যানয়েড তৃতীয় পক্ষের লাইব্রেরি যুক্ত করেছি github.com/ai/nanoid
ইয়ভেস এম।

13

অ্যাসিঙ্কের ES 2016 স্ট্যান্ডার্ড async এর মান ব্যবহার করে অপেক্ষা করার (আপ নোড 7 হিসাবে) আপ-টু ডেট সঠিক পদ্ধতিটি নিম্নলিখিত হবে:

const crypto = require('crypto');

function generateToken({ stringBase = 'base64', byteLength = 48 } = {}) {
  return new Promise((resolve, reject) => {
    crypto.randomBytes(byteLength, (err, buffer) => {
      if (err) {
        reject(err);
      } else {
        resolve(buffer.toString(stringBase));
      }
    });
  });
}

async function handler(req, res) {
   // default token length
   const newToken = await generateToken();
   console.log('newToken', newToken);

   // pass in parameters - adjust byte length
   const shortToken = await generateToken({byteLength: 20});
   console.log('newToken', shortToken);
}

এটি কোনও বাবেল রূপান্তর ছাড়াই নোড 7-এ বক্সের বাইরে কাজ করে


নাম বর্ণিত প্যারামিটারগুলি এখানে বর্ণিত হিসাবে পাস করার নতুন পদ্ধতিটি সংযুক্ত করার জন্য আমি এই উদাহরণটি আপডেট করেছি: 2ality.com/2011/11/keyword-paraters.html
real_ate

7

র‌্যান্ডম ইউআরএল এবং ফাইলনাম স্ট্রিং নিরাপদ (1 লাইনার)

Crypto.randomBytes(48).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');

এর সরলতার এক দুর্দান্ত উত্তর! কেবল সচেতন থাকুন যে এটি ইভেন্ট লুপটি একটি নির্বিচারবাদী উপায়ে স্টল করতে পারে (এটি প্রায়শই প্রাসঙ্গিকভাবে ব্যবহৃত হয় যদি কিছুটা বোঝা, সময় সংবেদনশীল সিস্টেমে ব্যবহৃত হয়)। অন্যথায়, একই জিনিস করুন, তবে এলোমেলোভাবে র্যান্ডমবাইটগুলির সংস্করণ ব্যবহার করুন। Nodejs.org/api/…
আলেক থিলেনিয়াস

6

চেক আউট:

var crypto = require('crypto');
crypto.randomBytes(Math.ceil(length/2)).toString('hex').slice(0,length);

নিস! একেবারে আন্ডাররেটেড সমাধান। আপনি যদি "দৈর্ঘ্য "টির নাম" কাঙ্ক্ষিত দৈর্ঘ্য "রাখেন এবং এটি ব্যবহারের আগে একটি মান দিয়ে শুরু করেন তবে দুর্দান্ত হবেন :)
ফ্লোরিয়ান ব্লুম

যে কারও জন্য অবাক হওয়ার জন্য, পছন্দসই দৈর্ঘ্যের জন্য বিজোড় ceilএবং sliceকলগুলি প্রয়োজনীয়। এমনকি দৈর্ঘ্যের জন্য, তারা কিছুই পরিবর্তন করে না।
শেঠ


4

এ লুক real_atesES2016 ভাবে, এটি আরো সঠিক।

ECMAScript 2016 (ES7) উপায়

import crypto from 'crypto';

function spawnTokenBuf() {
    return function(callback) {
        crypto.randomBytes(48, callback);
    };
}

async function() {
    console.log((await spawnTokenBuf()).toString('base64'));
};

জেনারেটর / ফলন উপায়

var crypto = require('crypto');
var co = require('co');

function spawnTokenBuf() {
    return function(callback) {
        crypto.randomBytes(48, callback);
    };
}

co(function* () {
    console.log((yield spawnTokenBuf()).toString('base64'));
});

@ জেফপাওয়ারস প্রকৃতপক্ষে, জাভাস্ক্রিপ্ট আপগ্রেড করছে :) লুপআপ প্রতিশ্রুতি এবং জেনারেটর!
কে - এসও-তে বিষক্রিয়া বাড়ছে।

অপেক্ষা করার চেষ্টা করুন, আরেকটি ইসিএমএ 7 প্রতিশ্রুতি হ্যান্ডলার
জৈন

আমি মনে করি যে আপনার ES 2016 কে এটির প্রথম উদাহরণ হিসাবে তৈরি করা উচিত কারণ এটি বেশিরভাগ ক্ষেত্রে "এটি করার সঠিক উপায়" এর দিকে এগিয়ে চলেছে
Real_ate

আমি নীচে আমার নিজের একটি উত্তর যুক্ত করেছি যা নোডের সাথে নির্দিষ্ট ছিল (আমদানির পরিবর্তে প্রয়োজনীয় ব্যবহার করে)। আপনি আমদানিটি কেন ব্যবহার করার কোনও বিশেষ কারণ ছিল? আপনার কি বাবেল চলছে?
আসল_মাস

@ রিয়াল_সেট প্রকৃতপক্ষে আমি ছিলাম, আমদানিটি আনুষ্ঠানিকভাবে সমর্থিত না হওয়া পর্যন্ত আমি কমনজেএস ব্যবহারে ফিরে এসেছি।
কে - এসও-তে বিষক্রিয়া বাড়ছে।


2

এনপিএম মডিউলটিইড বিভিন্ন ধরণের স্ট্রিং আইডি / কোড উত্পন্ন করতে নমনীয় এপিআই সরবরাহ করে।

48-এলোমেলো বাইট ব্যবহার করে A-Za-z0-9 এ এলোমেলো স্ট্রিং উত্পন্ন করতে:

const id = anyid().encode('Aa0').bits(48 * 8).random().id();
// G4NtiI9OYbSgVl3EAkkoxHKyxBAWzcTI7aH13yIUNggIaNqPQoSS7SpcalIqX0qGZ

এলোমেলো বাইট দ্বারা পূর্ণ স্ট্রিং দৈর্ঘ্যের বর্ণমালা তৈরি করতে:

const id = anyid().encode('Aa').length(20).random().id();
// qgQBBtDwGMuFHXeoVLpt

অভ্যন্তরীণভাবে এটি crypto.randomBytes()এলোমেলো উত্পন্ন করতে ব্যবহার করে।


1

এখানে @ ইয়ভ এম এর উত্তরের উপর থেকে ভার্সাম গ্রহণ করা একটি অ্যাসিঙ্ক সংস্করণ

var crypto = require('crypto');

function createCryptoString(length, chars) { // returns a promise which renders a crypto string

    if (!chars) { // provide default dictionary of chars if not supplied

        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    }

    return new Promise(function(resolve, reject) {

        var charsLength = chars.length;
        if (charsLength > 256) {
            reject('parm chars length greater than 256 characters' +
                        ' masks desired key unpredictability');
        }

        var randomBytes = crypto.randomBytes(length);

        var result = new Array(length);

        var cursor = 0;
        for (var i = 0; i < length; i++) {
            cursor += randomBytes[i];
            result[i] = chars[cursor % charsLength];
        }

        resolve(result.join(''));
    });
}

// --- now generate crypto string async using promise --- /

var wantStringThisLength = 64; // will generate 64 chars of crypto secure string

createCryptoString(wantStringThisLength)
.then(function(newCryptoString) {

    console.log(newCryptoString); // answer here

}).catch(function(err) {

    console.error(err);
});

1

সাধারণ ফাংশন যা আপনাকে একটি টোকেন দেয় যা ইউআরএল নিরাপদ এবং এতে বেস 64 এনকোডিং রয়েছে! এটি উপরে থেকে 2 টি উত্তরের সংমিশ্রণ।

const randomToken = () => {
    crypto.randomBytes(64).toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.