ওয়েব পুশ পেলোড এনক্রিপশন

Mat Scales

Chrome 50-এর আগে, পুশ বার্তাগুলিতে কোনও পেলোড ডেটা থাকতে পারে না। যখন 'পুশ' ইভেন্টটি আপনার পরিষেবা কর্মীকে বরখাস্ত করা হয়েছিল, আপনি কেবলমাত্র জানতেন যে সার্ভার আপনাকে কিছু বলার চেষ্টা করছে, কিন্তু এটি কী হতে পারে তা নয়। তারপরে আপনাকে সার্ভারে একটি ফলো-আপ অনুরোধ করতে হয়েছিল এবং দেখানোর জন্য বিজ্ঞপ্তির বিশদটি পেতে হয়েছিল, যা খারাপ নেটওয়ার্ক পরিস্থিতিতে ব্যর্থ হতে পারে।

এখন Chrome 50 এ (এবং ডেস্কটপে ফায়ারফক্সের বর্তমান সংস্করণে) আপনি পুশ সহ কিছু নির্বিচারে ডেটা পাঠাতে পারেন যাতে ক্লায়েন্ট অতিরিক্ত অনুরোধ করা এড়াতে পারে। যাইহোক, মহান শক্তির সাথে মহান দায়িত্ব আসে, তাই সমস্ত পেলোড ডেটা এনক্রিপ্ট করা আবশ্যক।

পেলোডগুলির এনক্রিপশন ওয়েব পুশের জন্য নিরাপত্তা গল্পের একটি গুরুত্বপূর্ণ অংশ। ব্রাউজার এবং আপনার নিজের সার্ভারের মধ্যে যোগাযোগ করার সময় HTTPS আপনাকে নিরাপত্তা দেয়, কারণ আপনি সার্ভারকে বিশ্বাস করেন। যাইহোক, ব্রাউজার চয়ন করে যে কোন পুশ প্রদানকারীকে প্রকৃতপক্ষে পেলোড সরবরাহ করতে ব্যবহার করা হবে, তাই অ্যাপ বিকাশকারী হিসাবে আপনার এটির উপর কোন নিয়ন্ত্রণ নেই।

এখানে, HTTPS শুধুমাত্র গ্যারান্টি দিতে পারে যে পুশ পরিষেবা প্রদানকারীর কাছে ট্রানজিট করার সময় কেউ বার্তাটি স্নুপ করতে পারবে না। একবার তারা এটি পেয়ে গেলে, তারা তৃতীয় পক্ষের কাছে পেলোডটি পুনরায় প্রেরণ করা বা অন্য কিছুতে দূষিতভাবে পরিবর্তন করা সহ তারা যা পছন্দ করে তা করতে স্বাধীন। এর বিরুদ্ধে সুরক্ষার জন্য আমরা এনক্রিপশন ব্যবহার করি যাতে পুশ পরিষেবাগুলি ট্রানজিটে পেলোডগুলি পড়তে বা বিকৃত করতে না পারে।

ক্লায়েন্ট-সাইড পরিবর্তন

আপনি যদি ইতিমধ্যেই পেলোড ছাড়াই পুশ বিজ্ঞপ্তিগুলি প্রয়োগ করে থাকেন তবে ক্লায়েন্ট-সাইডে আপনাকে শুধুমাত্র দুটি ছোট পরিবর্তন করতে হবে।

এটি প্রথমে হল যে আপনি যখন আপনার ব্যাকএন্ড সার্ভারে সাবস্ক্রিপশন তথ্য পাঠান তখন আপনাকে কিছু অতিরিক্ত তথ্য সংগ্রহ করতে হবে। আপনি যদি ইতিমধ্যেই PushSubscription অবজেক্টে JSON.stringify() ব্যবহার করেন আপনার সার্ভারে পাঠানোর জন্য এটিকে সিরিয়ালাইজ করতে তাহলে আপনাকে কিছু পরিবর্তন করতে হবে না। সাবস্ক্রিপশনে এখন কী বৈশিষ্ট্যে কিছু অতিরিক্ত ডেটা থাকবে।

> JSON.stringify(subscription)
{"endpoint":"https://android.googleapis.com/gcm/send/f1LsxkKphfQ:APA91bFUx7ja4BK4JVrNgVjpg1cs9lGSGI6IMNL4mQ3Xe6mDGxvt_C_gItKYJI9CAx5i_Ss6cmDxdWZoLyhS2RJhkcv7LeE6hkiOsK6oBzbyifvKCdUYU7ADIRBiYNxIVpLIYeZ8kq_A",
"keys":{"p256dh":"BLc4xRzKlKORKWlbdgFaBrrPK3ydWAHo4M0gs0i1oEKgPpWC5cW8OCzVrOQRv-1npXRWk8udnW3oYhIO4475rds=",
"auth":"5I2Bu2oKdyy9CwL8QVF0NQ=="}}

দুটি মান p256dh এবং auth বেস64-এর একটি ভেরিয়েন্টে এনকোড করা হয়েছে যেটিকে আমি URL-Safe Base64 বলব।

আপনি যদি পরিবর্তে বাইটগুলিতে ডান পেতে চান তবে আপনি সাবস্ক্রিপশনে নতুন getKey() পদ্ধতি ব্যবহার করতে পারেন যা একটি ArrayBuffer হিসাবে একটি প্যারামিটার প্রদান করে। আপনার যে দুটি প্যারামিটার প্রয়োজন তা হল auth এবং p256dh

> new Uint8Array(subscription.getKey('auth'));
[228, 141, 129, ...] (16 bytes)

> new Uint8Array(subscription.getKey('p256dh'));
[4, 183, 56, ...] (65 bytes)

দ্বিতীয় পরিবর্তনটি হল একটি নতুন ডেটা বৈশিষ্ট্য যখন push ইভেন্ট ফায়ার হয়। এটিতে প্রাপ্ত ডেটা পার্স করার জন্য বিভিন্ন সিঙ্ক্রোনাস পদ্ধতি রয়েছে, যেমন .text() , .json() , .arrayBuffer() এবং .blob()

self.addEventListener('push', function(event) {
  if (event.data) {
    console.log(event.data.json());
  }
});

সার্ভার-সাইড পরিবর্তন

সার্ভারের দিকে, জিনিসগুলি একটু বেশি পরিবর্তিত হয়। মূল প্রক্রিয়াটি হল আপনি পেলোড এনক্রিপ্ট করতে ক্লায়েন্টের কাছ থেকে পাওয়া এনক্রিপশন কী তথ্য ব্যবহার করেন এবং তারপরে কিছু অতিরিক্ত HTTP শিরোনাম যোগ করে সাবস্ক্রিপশনের শেষ পয়েন্টে একটি POST অনুরোধের বডি হিসেবে পাঠান।

বিশদগুলি তুলনামূলকভাবে জটিল, এবং এনক্রিপশন সম্পর্কিত যে কোনও কিছুর মতো আপনার নিজের রোল করার চেয়ে সক্রিয়ভাবে বিকাশ করা লাইব্রেরি ব্যবহার করা ভাল। Chrome টিম Node.js-এর জন্য একটি লাইব্রেরি প্রকাশ করেছে, আরও ভাষা এবং প্ল্যাটফর্ম শীঘ্রই আসছে৷ এটি এনক্রিপশন এবং ওয়েব পুশ প্রোটোকল উভয়ই পরিচালনা করে, যাতে একটি Node.js সার্ভার থেকে একটি পুশ বার্তা পাঠানো webpush.sendWebPush(message, subscription) মতোই সহজ।

যদিও আমরা অবশ্যই একটি লাইব্রেরি ব্যবহার করার পরামর্শ দিই, এটি একটি নতুন বৈশিষ্ট্য এবং এমন অনেক জনপ্রিয় ভাষা রয়েছে যেগুলির এখনও কোনও লাইব্রেরি নেই৷ আপনি যদি নিজের জন্য এটি বাস্তবায়ন করতে চান তবে এখানে বিশদ রয়েছে।

আমি নোড-স্বাদযুক্ত জাভাস্ক্রিপ্ট ব্যবহার করে অ্যালগরিদমগুলি চিত্রিত করব, তবে মৌলিক নীতিগুলি যে কোনও ভাষায় একই হওয়া উচিত।

ইনপুট

একটি বার্তা এনক্রিপ্ট করার জন্য, আমাদের প্রথমে সাবস্ক্রিপশন অবজেক্ট থেকে দুটি জিনিস পেতে হবে যা আমরা ক্লায়েন্টের কাছ থেকে পেয়েছি। আপনি যদি ক্লায়েন্টে JSON.stringify() ব্যবহার করেন এবং সেটি আপনার সার্ভারে প্রেরণ করেন তাহলে ক্লায়েন্টের সর্বজনীন কী keys.p256dh ক্ষেত্রে সংরক্ষণ করা হয়, যখন ভাগ করা প্রমাণীকরণ গোপনীয়তা keys.auth ক্ষেত্রে থাকে। এই দুটিই URL-নিরাপদ বেস64 এনকোড করা হবে, যেমন উপরে উল্লিখিত হয়েছে। ক্লায়েন্ট পাবলিক কী-এর বাইনারি বিন্যাস হল একটি অসংকুচিত P-256 উপবৃত্তাকার বক্ররেখা বিন্দু।

const clientPublicKey = new Buffer(subscription.keys.p256dh, 'base64');
const clientAuthSecret = new Buffer(subscription.keys.auth, 'base64');

পাবলিক কী আমাদের বার্তাটিকে এনক্রিপ্ট করার অনুমতি দেয় যাতে এটি শুধুমাত্র ক্লায়েন্টের ব্যক্তিগত কী ব্যবহার করে ডিক্রিপ্ট করা যায়।

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

আমাদের কিছু নতুন ডেটাও তৈরি করতে হবে। আমাদের একটি 16-বাইট ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এলোমেলো লবণ এবং উপবৃত্তাকার কার্ভ কীগুলির একটি পাবলিক/প্রাইভেট জোড়া দরকার। পুশ এনক্রিপশন স্পেক দ্বারা ব্যবহৃত বিশেষ বক্ররেখাকে P-256 বা prime256v1 বলা হয়। সর্বোত্তম নিরাপত্তার জন্য আপনি যখনই একটি বার্তা এনক্রিপ্ট করবেন তখনই মূল জোড়াটি স্ক্র্যাচ থেকে তৈরি করা উচিত এবং আপনার কখনই লবণ পুনরায় ব্যবহার করা উচিত নয়।

ইসিডিএইচ

উপবৃত্তাকার বক্ররেখা ক্রিপ্টোগ্রাফির একটি ঝরঝরে সম্পত্তি সম্পর্কে কথা বলার জন্য আসুন একটু দূরে নিয়ে যাই। তুলনামূলকভাবে সহজ প্রক্রিয়া আছে যা আপনার প্রাইভেট কীকে অন্য কারো পাবলিক কী-এর সাথে একত্রিত করে একটি মান বের করে। তাই কি? ঠিক আছে, যদি অন্য পক্ষ তাদের ব্যক্তিগত কী এবং আপনার সর্বজনীন কী নেয় তবে এটি একই মান অর্জন করবে!

এটি উপবৃত্তাকার বক্ররেখা ডিফি-হেলম্যান (ECDH) কী চুক্তি প্রোটোকলের ভিত্তি, যা উভয় পক্ষকে একই ভাগ করা গোপন রাখতে দেয় যদিও তারা শুধুমাত্র পাবলিক কী বিনিময় করে। আমরা আমাদের প্রকৃত এনক্রিপশন কীটির ভিত্তি হিসাবে এই ভাগ করা গোপনীয়তাটি ব্যবহার করব৷

const crypto = require('crypto');

const salt = crypto.randomBytes(16);

// Node has ECDH built-in to the standard crypto library. For some languages
// you may need to use a third-party library.
const serverECDH = crypto.createECDH('prime256v1');
const serverPublicKey = serverECDH.generateKeys();
const sharedSecret = serverECDH.computeSecret(clientPublicKey);

HKDF

ইতিমধ্যে অন্য একটি সরাইয়া জন্য সময়. ধরা যাক যে আপনার কাছে কিছু গোপন ডেটা আছে যা আপনি একটি এনক্রিপশন কী হিসাবে ব্যবহার করতে চান, কিন্তু এটি ক্রিপ্টোগ্রাফিকভাবে যথেষ্ট সুরক্ষিত নয়৷ কম নিরাপত্তা সহ একটি গোপন বিষয়কে উচ্চ নিরাপত্তায় পরিণত করতে আপনি HMAC-ভিত্তিক কী ডেরিভেশন ফাংশন (HKDF) ব্যবহার করতে পারেন।

এটি যেভাবে কাজ করে তার একটি ফলাফল হল যে এটি আপনাকে যেকোন সংখ্যক বিটের গোপনীয়তা নিতে দেয় এবং আপনি যে হ্যাশিং অ্যালগরিদম ব্যবহার করেন তার দ্বারা উত্পাদিত হ্যাশের 255 গুণ পর্যন্ত যে কোনো আকারের আরেকটি গোপনীয়তা তৈরি করতে দেয়। পুশের জন্য, স্পেক এর জন্য আমাদের SHA-256 ব্যবহার করতে হবে, যার হ্যাশ দৈর্ঘ্য 32 বাইট (256 বিট)।

যেহেতু এটি ঘটে, আমরা জানি যে আমাদের কেবলমাত্র 32 বাইট পর্যন্ত আকারের কী তৈরি করতে হবে। এর মানে হল যে আমরা অ্যালগরিদমের একটি সরলীকৃত সংস্করণ ব্যবহার করতে পারি যা বড় আউটপুট আকারগুলি পরিচালনা করতে পারে না।

আমি নীচে একটি নোড সংস্করণের জন্য কোডটি অন্তর্ভুক্ত করেছি, তবে আপনি এটি RFC 5869 এ আসলে কীভাবে কাজ করে তা খুঁজে পেতে পারেন।

HKDF-এর ইনপুটগুলি হল একটি লবণ, কিছু প্রাথমিক কী করার উপাদান (ikm), বর্তমান ব্যবহারের ক্ষেত্রে (তথ্য) নির্দিষ্ট কাঠামোগত ডেটার একটি ঐচ্ছিক অংশ এবং পছন্দসই আউটপুট কীটির বাইটে দৈর্ঘ্য।

// Simplified HKDF, returning keys up to 32 bytes long
function hkdf(salt, ikm, info, length) {
  if (length > 32) {
    throw new Error('Cannot return keys of more than 32 bytes, ${length} requested');
  }

  // Extract
  const keyHmac = crypto.createHmac('sha256', salt);
  keyHmac.update(ikm);
  const key = keyHmac.digest();

  // Expand
  const infoHmac = crypto.createHmac('sha256', key);
  infoHmac.update(info);
  // A one byte long buffer containing only 0x01
  const ONE_BUFFER = new Buffer(1).fill(1);
  infoHmac.update(ONE_BUFFER);
  return infoHmac.digest().slice(0, length);
}

এনক্রিপশন পরামিতি প্রাপ্ত

প্রকৃত এনক্রিপশনের জন্য আমাদের কাছে থাকা ডেটাকে প্যারামিটারে পরিণত করতে আমরা এখন HKDF ব্যবহার করি।

আমরা প্রথমে যে কাজটি করি তা হল HKDF ব্যবহার করে ক্লায়েন্ট প্রমাণীকরণের গোপনীয়তা এবং ভাগ করা গোপনকে একটি দীর্ঘ, আরও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত গোপনে মিশ্রিত করতে। বিশেষত্বে এটিকে সিউডো-র্যান্ডম কী (PRK) হিসাবে উল্লেখ করা হয়েছে তাই আমি এটিকে এখানে বলব, যদিও ক্রিপ্টোগ্রাফি বিশুদ্ধতাবাদীরা মনে রাখতে পারেন যে এটি কঠোরভাবে একটি PRK নয়।

এখন আমরা চূড়ান্ত বিষয়বস্তু এনক্রিপশন কী এবং একটি নন্স তৈরি করি যা সাইফারে পাঠানো হবে। এগুলি প্রতিটির জন্য একটি সাধারণ ডেটা কাঠামো তৈরি করে তৈরি করা হয়, যাকে একটি তথ্য হিসাবে উল্লেখ করা হয় , যাতে বার্তাটির উত্স আরও যাচাই করার জন্য তথ্যের উপবৃত্তাকার বক্ররেখা, প্রেরক এবং প্রাপকের জন্য নির্দিষ্ট তথ্য থাকে। তারপরে আমরা PRK, আমাদের লবণ এবং তথ্যের সাথে HKDF ব্যবহার করি সঠিক আকারের কী এবং ননস বের করতে।

বিষয়বস্তু এনক্রিপশনের জন্য তথ্যের ধরন হল 'aesgcm' যা পুশ এনক্রিপশনের জন্য ব্যবহৃত সাইফারের নাম।

const authInfo = new Buffer('Content-Encoding: auth\0', 'utf8');
const prk = hkdf(clientAuthSecret, sharedSecret, authInfo, 32);

function createInfo(type, clientPublicKey, serverPublicKey) {
  const len = type.length;

  // The start index for each element within the buffer is:
  // value               | length | start    |
  // -----------------------------------------
  // 'Content-Encoding: '| 18     | 0        |
  // type                | len    | 18       |
  // nul byte            | 1      | 18 + len |
  // 'P-256'             | 5      | 19 + len |
  // nul byte            | 1      | 24 + len |
  // client key length   | 2      | 25 + len |
  // client key          | 65     | 27 + len |
  // server key length   | 2      | 92 + len |
  // server key          | 65     | 94 + len |
  // For the purposes of push encryption the length of the keys will
  // always be 65 bytes.
  const info = new Buffer(18 + len + 1 + 5 + 1 + 2 + 65 + 2 + 65);

  // The string 'Content-Encoding: ', as utf-8
  info.write('Content-Encoding: ');
  // The 'type' of the record, a utf-8 string
  info.write(type, 18);
  // A single null-byte
  info.write('\0', 18 + len);
  // The string 'P-256', declaring the elliptic curve being used
  info.write('P-256', 19 + len);
  // A single null-byte
  info.write('\0', 24 + len);
  // The length of the client's public key as a 16-bit integer
  info.writeUInt16BE(clientPublicKey.length, 25 + len);
  // Now the actual client public key
  clientPublicKey.copy(info, 27 + len);
  // Length of our public key
  info.writeUInt16BE(serverPublicKey.length, 92 + len);
  // The key itself
  serverPublicKey.copy(info, 94 + len);

  return info;
}

// Derive the Content Encryption Key
const contentEncryptionKeyInfo = createInfo('aesgcm', clientPublicKey, serverPublicKey);
const contentEncryptionKey = hkdf(salt, prk, contentEncryptionKeyInfo, 16);

// Derive the Nonce
const nonceInfo = createInfo('nonce', clientPublicKey, serverPublicKey);
const nonce = hkdf(salt, prk, nonceInfo, 12);

প্যাডিং

আরেকটি বাদ দিয়ে, এবং একটি নির্বোধ এবং কল্পিত উদাহরণের জন্য সময়। ধরা যাক যে আপনার বসের একটি সার্ভার রয়েছে যা তাকে প্রতি কয়েক মিনিটে কোম্পানির স্টক মূল্যের সাথে একটি পুশ বার্তা পাঠায়। এর জন্য সরল বার্তাটি সর্বদা সেন্টের মান সহ একটি 32-বিট পূর্ণসংখ্যা হবে। ক্যাটারিং স্টাফদের সাথেও তার একটি গোপন চুক্তি রয়েছে যার অর্থ হল তারা আসলে ডেলিভারির 5 মিনিট আগে তাকে স্ট্রিং "ব্রেক রুমে ডোনাটস" পাঠাতে পারে যাতে তারা পৌঁছানোর সময় "কাকতালীয়ভাবে" সেখানে উপস্থিত হতে পারে এবং সেরাটি ধরতে পারে। .

ওয়েব পুশ দ্বারা ব্যবহৃত সাইফারটি এনক্রিপ্ট করা মান তৈরি করে যা এনক্রিপ্ট করা ইনপুটের চেয়ে ঠিক 16 বাইট দীর্ঘ। যেহেতু "ডোনাটস ইন দ্য ব্রেক রুমে" 32-বিট স্টক মূল্যের চেয়ে দীর্ঘ, যেকোন স্নুপিং কর্মচারী বার্তাগুলিকে ডিক্রিপ্ট না করেই ডোনাটগুলি কখন আসছে তা কেবল ডেটার দৈর্ঘ্য থেকে বলতে সক্ষম হবে৷

এই কারণে, ওয়েব পুশ প্রোটোকল আপনাকে ডেটার শুরুতে প্যাডিং যুক্ত করতে দেয়। আপনি কীভাবে এটি ব্যবহার করবেন তা আপনার অ্যাপ্লিকেশনের উপর নির্ভর করে, কিন্তু উপরের উদাহরণে আপনি সমস্ত বার্তাগুলিকে ঠিক 32 বাইট হতে প্যাড করতে পারেন, যা শুধুমাত্র দৈর্ঘ্যের উপর ভিত্তি করে বার্তাগুলিকে আলাদা করা অসম্ভব করে তোলে৷

প্যাডিং মান হল একটি 16-বিট বিগ-এন্ডিয়ান পূর্ণসংখ্যা যা প্যাডিংয়ের দৈর্ঘ্যের পরে প্যাডিংয়ের NUL বাইটের সংখ্যা উল্লেখ করে। তাই ন্যূনতম প্যাডিং হল দুটি বাইট - শূন্য সংখ্যাটি 16 বিটে এনকোড করা হয়েছে।

const padding = new Buffer(2 + paddingLength);
// The buffer must be only zeroes, except the length
padding.fill(0);
padding.writeUInt16BE(paddingLength, 0);

যখন আপনার পুশ বার্তাটি ক্লায়েন্টের কাছে আসে, তখন ব্রাউজারটি স্বয়ংক্রিয়ভাবে যেকোনো প্যাডিং বের করে দিতে সক্ষম হবে, তাই আপনার ক্লায়েন্ট কোডটি কেবলমাত্র প্যাড না করা বার্তাটি পাবে।

এনক্রিপশন

এখন আমরা অবশেষে এনক্রিপশন করতে সব জিনিস আছে. ওয়েব পুশের জন্য প্রয়োজনীয় সাইফার হল GCM ব্যবহার করে AES128 । আমরা আমাদের বিষয়বস্তু এনক্রিপশন কী ব্যবহার করি কী হিসেবে এবং ননসটিকে ইনিশিয়ালাইজেশন ভেক্টর (IV) হিসেবে ব্যবহার করি।

এই উদাহরণে আমাদের ডেটা একটি স্ট্রিং, তবে এটি যেকোনো বাইনারি ডেটা হতে পারে। আপনি এনক্রিপশন তথ্যের জন্য 16-বাইট এবং প্যাডিংয়ের জন্য কমপক্ষে 2 বাইট সহ, 4078 বাইট - 4096 বাইট সর্বোচ্চ পোস্ট প্রতি পেলোড পাঠাতে পারেন।

// Create a buffer from our data, in this case a UTF-8 encoded string
const plaintext = new Buffer('Push notification payload!', 'utf8');
const cipher = crypto.createCipheriv('id-aes128-GCM', contentEncryptionKey,
nonce);

const result = cipher.update(Buffer.concat(padding, plaintext));
cipher.final();

// Append the auth tag to the result - https://nodejs.org/api/crypto.html#crypto_cipher_getauthtag
return Buffer.concat([result, cipher.getAuthTag()]);

ওয়েব পুশ

ফাউ! এখন আপনার কাছে একটি এনক্রিপ্ট করা পেলোড আছে, আপনাকে ব্যবহারকারীর সাবস্ক্রিপশন দ্বারা নির্দিষ্ট শেষ পয়েন্টে অপেক্ষাকৃত সহজ HTTP POST অনুরোধ করতে হবে।

আপনাকে তিনটি হেডার সেট করতে হবে।

Encryption: salt=<SALT>
Crypto-Key: dh=<PUBLICKEY>
Content-Encoding: aesgcm

<SALT> এবং <PUBLICKEY> হল এনক্রিপশনে ব্যবহৃত সল্ট এবং সার্ভার পাবলিক কী, URL-নিরাপদ বেস64 হিসাবে এনকোড করা।

ওয়েব পুশ প্রোটোকল ব্যবহার করার সময়, POST এর মূল অংশটি তখন এনক্রিপ্ট করা বার্তার কাঁচা বাইট। যাইহোক, যতক্ষণ না Chrome এবং Firebase ক্লাউড মেসেজিং প্রোটোকল সমর্থন করে, আপনি সহজেই আপনার বিদ্যমান JSON পেলোডে ডেটা অন্তর্ভুক্ত করতে পারেন।

{
    "registration_ids": [ "…" ],
    "raw_data": "BIXzEKOFquzVlr/1tS1bhmobZ…"
}

rawData সম্পত্তির মান অবশ্যই এনক্রিপ্ট করা বার্তার base64 এনকোডেড উপস্থাপনা হতে হবে।

ডিবাগিং / যাচাইকারী

পিটার বেভারলু, ক্রোম ইঞ্জিনিয়ারদের মধ্যে একজন যারা বৈশিষ্ট্যটি বাস্তবায়ন করেছেন (সেইসাথে সেই ব্যক্তিদের মধ্যে একজন যারা বিশেষত্বে কাজ করেছেন), একটি যাচাইকারী তৈরি করেছেন

এনক্রিপশনের প্রতিটি মধ্যবর্তী মানের আউটপুট করার জন্য আপনার কোড পেয়ে আপনি সেগুলি যাচাইকারীতে পেস্ট করতে পারেন এবং আপনি সঠিক পথে আছেন কিনা তা পরীক্ষা করতে পারেন।