মার্চেন্টদের জন্য পেমেন্ট ডেটা ক্রিপ্টোগ্রাফি

Google Pay API, সাইন করা ও এনক্রিপ্ট করা PaymentMethodToken পেলোডে পেমেন্ট পদ্ধতি ফেরত পাঠায়। ফেরত আসা পেমেন্ট পদ্ধতিগুলি হল এমন কার্ড যাতে PAN থাকে অথবা টোকেনাইজ করা কার্ড যাতে ডিভাইস PAN এবং ক্রিপ্টোগ্রাম থাকে।

পেলোডে protocolVersion নামে একটি ফিল্ড থাকে যা পেলোডের প্রাপককে জানায় যে কোন ক্রিপ্টোগ্রাফিক প্রিমিটিভ ব্যবহার করা হচ্ছে এবং প্রত্যাশিত ফর্ম্যাট কী।

এই নির্দেশিকা থেকে আপনি জানতে পারবেন যে Google-এর স্বাক্ষর করা এবং এনক্রিপ্ট করা পেমেন্ট পদ্ধতি টোকেনের অনুরোধ করার জন্য কীভাবে সর্বজনীন কী তৈরি করতে হয় এবং টোকেন যাচাই ও ডিক্রিপ্ট করার জন্য কী কী পদক্ষেপ নিতে হয়।

এই নির্দেশিকা শুধুমাত্র protocolVersion = ECv2-এর ক্ষেত্রে প্রযোজ্য।

আপনি সরাসরি পেমেন্ট কার্ডের তথ্য পান, তাই আপনার অ্যাপ PCI DSS মেনে চলে কিনা এবং ব্যবহারকারীর পেমেন্ট ক্রেডেনশিয়াল নিরাপদে ম্যানেজ করার জন্য আপনার সার্ভারে প্রয়োজনীয় ইনফ্রাস্ট্রাকচার আছে কিনা তা নিশ্চিত করুন।

Google Pay API ECv2 PaymentMethodToken পেলোড ব্যবহার করার জন্য ইন্টিগ্রেটরকে কী করতে হবে তা নিম্নলিখিত ধাপে উল্লেখ করা হয়েছে:

  1. Google রুট সাইনিং কী ফেচ করুন।
  2. যাচাই করুন যে ইন্টারমিডিয়েট সাইনিং কী-এর স্বাক্ষর মেয়াদ শেষ না হওয়া যেকোনও রুট সাইনিং কী-এর মাধ্যমে বৈধ।
  3. পে-লোডের ইন্টারমিডিয়েট সাইনিং 'কী'-এর মেয়াদ শেষ হয়ে যায়নি তা যাচাই করুন।
  4. ইন্টারমিডিয়েট সাইনিং কী-এর মাধ্যমে পেলোডের স্বাক্ষর সঠিক কিনা তা যাচাই করুন।
  5. আপনি স্বাক্ষর যাচাই করার পরে পেলোডের কন্টেন্ট ডিক্রিপ্ট করুন।
  6. মেসেজের মেয়াদ শেষ হয়ে যায়নি তা যাচাই করুন। এর জন্য আপনাকে চেক করতে হবে যে বর্তমান সময় ডিক্রিপ্ট করা কন্টেন্টের messageExpiration ফিল্ডের থেকে কম কিনা।
  7. ডিক্রিপ্ট করা কন্টেন্টে পেমেন্ট পদ্ধতি ব্যবহার করে চার্জ করুন।

আমাদের Tink লাইব্রেরিতে স্যাম্পেল কোড ১–৬ ধাপগুলি পারফর্ম করে।

পেমেন্ট পদ্ধতি টোকেন স্ট্রাকচার

PaymentData রেসপন্সে Google-এর পাঠানো মেসেজ হল UTF-8 এনকোড করা, সিরিয়ালাইজ করা JSON অবজেক্ট, যার কীগুলি নিম্নলিখিত টেবিলে উল্লেখ করা আছে:

নাম ধরন বিবরণ
protocolVersion স্ট্রিং যে এনক্রিপশন বা সাইনিং স্কিমের অধীনে মেসেজটি তৈরি করা হয়েছে তা শনাক্ত করে। প্রয়োজন হলে, এটি প্রোটোকলকে সময়ের সাথে সাথে উন্নত হতে সাহায্য করে।
signature স্ট্রিং মেসেজটি Google থেকে এসেছে কিনা তা যাচাই করে। এটি base64-এনকোড করা এবং ইন্টারমিডিয়েট সাইনিং কী-এর মাধ্যমে ECDSA-এর সাহায্যে তৈরি করা হয়েছে।
intermediateSigningKey অবজেক্ট একটি JSON অবজেক্ট যাতে Google থেকে পাওয়া ইন্টারমিডিয়েট সাইনিং কী থাকে। এতে keyValue, keyExpiration ও signatures সহ signedKey আছে। ইন্টারমিডিয়েট সাইনিং কী সিগনেচার যাচাইকরণ প্রসেস সহজ করতে এটি সিরিয়ালাইজ করা হয়।
signedMessage স্ট্রিং HTML-নিরাপদ স্ট্রিং হিসেবে সিরিয়ালাইজ করা JSON অবজেক্ট যাতে encryptedMessage, ephemeralPublicKey ও tag আছে। স্বাক্ষর যাচাইকরণ প্রসেস সহজ করার জন্য এটি সিরিয়ালাইজ করা হয়েছে।

উদাহরণ

JSON-এ পেমেন্ট পদ্ধতি টোকেন রেসপন্স নিচে দেওয়া হল:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

ইন্টারমিডিয়েট সাইনিং কী

intermediateSigningKey হল UTF-8 এনকোড করা, সিরিয়ালাইজ করা JSON অবজেক্ট যাতে নিম্নলিখিত ভ্যালু থাকে:

নাম ধরন বিবরণ
signedKey স্ট্রিং Base64-এনকোড করা মেসেজ যাতে 'কী'-এর পেমেন্টের বিবরণ থাকে।
signatures স্ট্রিং ইন্টারমিডিয়েট সাইনিং কী Google থেকে এসেছে কিনা তা যাচাই করে। এটি base64-এনকোড করা এবং ECDSA-এর মাধ্যমে তৈরি করা হয়েছে।

স্বাক্ষরিত কী

signedKey হল UTF-8 এনকোড করা, সিরিয়ালাইজ করা JSON অবজেক্ট যাতে নিম্নলিখিত ভ্যালু থাকে:

নাম ধরন বিবরণ
keyValue স্ট্রিং ASN.1 টাইপে এনকোড করা 'কী'-এর base64 ভার্সন। SubjectPublicKeyInfo X.509 স্ট্যান্ডার্ডে উল্লেখ করা আছে।
keyExpiration স্ট্রিং ইন্টারমিডিয়েট কী-এর মেয়াদ শেষ হওয়ার তারিখ ও সময়, যা ইপক থেকে UTC মিলিসেকেন্ড হিসেবে দেখানো হয়। ইন্টিগ্রেটর মেয়াদ শেষ হয়ে যাওয়া যেকোনও 'কী' বাতিল করে দেয়।

স্বাক্ষরিত মেসেজ

signedMessage হল UTF-8 এনকোড করা, সিরিয়ালাইজ করা JSON অবজেক্ট যাতে নিম্নলিখিত ভ্যালু থাকে:

নাম ধরন বিবরণ
encryptedMessage স্ট্রিং Base64-এনকোড করা এনক্রিপ্ট করা মেসেজ যাতে পেমেন্টের তথ্য এবং কিছু অতিরিক্ত সুরক্ষা ফিল্ড থাকে।
ephemeralPublicKey স্ট্রিং আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে মেসেজ এনক্রিপ্ট করার জন্য ব্যক্তিগত কীয়ের সাথে যুক্ত base64-এনকোড করা ক্ষণস্থায়ী সর্বজনীন কী। আরও তথ্যের জন্য, এনক্রিপশন সর্বজনীন কী ফর্ম্যাট দেখুন।
tag স্ট্রিং encryptedMessage-এর base64-এনকোড করা MAC।

এনক্রিপটেড মেসেজ

ডিক্রিপ্ট করা encryptedMessage হল UTF-8 এনকোড করা, সিরিয়ালাইজ করা JSON অবজেক্ট। JSON-এ দুটি লেভেল আছে। বাইরের লেভেলে মেটাডেটা এবং নিরাপত্তার জন্য অন্তর্ভুক্ত ফিল্ড থাকে, যেখানে ভিতরের লেভেল হল আরেকটি JSON অবজেক্ট যা আসল পেমেন্ট ক্রেডেনশিয়ালকে দেখায়।

encryptedMessage সম্পর্কে আরও জানতে, নিম্নলিখিত সারণী এবং JSON অবজেক্টের উদাহরণ দেখুন:

নাম ধরন বিবরণ
messageExpiration স্ট্রিং যে তারিখ ও সময়ে মেসেজের মেয়াদ শেষ হয়ে যায়, সেটি UTC মিলিসেকেন্ডে দেখানো হয়। ইন্টিগ্রেটরদের মেয়াদ শেষ হয়ে যাওয়া মেসেজ বাতিল করে দেওয়া উচিত।
messageId স্ট্রিং একটি অনন্য আইডি যা মেসেজটি শনাক্ত করে, যদি এটি প্রত্যাহার করার প্রয়োজন হয় বা পরে কোনও সময়ে খুঁজে পেতে হয়।
paymentMethod স্ট্রিং পেমেন্ট ক্রেডেনশিয়ালের ধরন। বর্তমানে, শুধুমাত্র CARD কাজ করে।
paymentMethodDetails অবজেক্ট পেমেন্ট ক্রেডেনশিয়াল। এই অবজেক্টের ফর্ম্যাট paymentMethod দ্বারা নির্ধারিত হয় এবং নিচের সারণীতে বর্ণনা করা হয়েছে।

কার্ড

CARD পেমেন্ট পদ্ধতির জন্য নিম্নলিখিত প্রপার্টি পেমেন্ট ক্রেডেনশিয়াল তৈরি করে:

নাম ধরন বিবরণ
pan স্ট্রিং ব্যক্তিগত অ্যাকাউন্ট নম্বরে চার্জ করা হয়েছে। এই স্ট্রিংয়ে শুধু সংখ্যা আছে।
expirationMonth নম্বর কার্ডের মেয়াদ শেষ হওয়ার মাস, যেখানে ১ মানে জানুয়ারি, ২ মানে ফেব্রুয়ারি, এবং এইভাবে চলতে থাকে।
expirationYear নম্বর কার্ডের মেয়াদ শেষ হওয়ার বছর চার সংখ্যার হয়, যেমন ২০২০।
authMethod স্ট্রিং কার্ড ট্রানজ্যাকশনের যাচাইকরণ পদ্ধতি।
merchantTokenId স্ট্রিং

কার্ড ট্রানজ্যাকশনের মার্চেন্ট টোকেন আইডি। এই ঐচ্ছিক ফিল্ডটি শুধুমাত্র তখনই ফেরত দেওয়া হয় যদি নিম্নলিখিত সব শর্ত পূরণ করা হয়:

  • মার্চেন্ট অনুরোধে MIT *TransactionInfo অবজেক্ট নির্দিষ্ট করে।
  • মার্চেন্ট অনুরোধে tokenUpdateUrl অন্তর্ভুক্ত করে।
  • ব্যবহারকারী টোকেনাইজ করা ইনস্ট্রুমেন্ট (যেমন, DPAN) বেছে নেন।

PAN_ONLY

নিম্নলিখিত JSON স্নিপেট হল PAN_ONLY authMethod সহ CARD paymentMethod -এর জন্য সম্পূর্ণ encryptedMessage-এর একটি উদাহরণ।

{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "PAN_ONLY",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2025
  },
  "gatewayMerchantId": "some-merchant-id",
  "messageId": "some-message-id",
  "messageExpiration": "1759309000000"
}

CRYPTOGRAM_3DS

CARD 3-D Secure ক্রিপ্টোগ্রাম ব্যবহার করে যাচাই করা হয়েছে, CRYPTOGRAM_3DS authMethod। এতে নিম্নলিখিত অতিরিক্ত ফিল্ড অন্তর্ভুক্ত:

নাম ধরন বিবরণ
cryptogram স্ট্রিং একটি 3-D Secure ক্রিপ্টোগ্রাম।
eciIndicator স্ট্রিং এই স্ট্রিং সবসময় থাকে না। এটি শুধুমাত্র Android-এ যাচাই করা ডিভাইস টোকেন ট্রানজ্যাকশনের জন্য রিটার্ন করে (CRYPTOGRAM_3DS)। এই ভ্যালু পেমেন্ট প্রসেসিং ফ্লোতে পাস করতে হবে।

নিম্নলিখিত JSON স্নিপেটটি হল CARD paymentMethod-এর জন্য সম্পূর্ণ encryptedMessage-এর একটি উদাহরণ CRYPTOGRAM_3DS authMethod সহ:

{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "CRYPTOGRAM_3DS",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2025,
    "cryptogram": "AAAAAA...",
    "eciIndicator": "eci indicator",
    "merchantTokenId": "merchant-token-id",
    
  },
  
  "messageId": "some-message-id",
  "messageExpiration": "1759309000000"
}

eciIndicator

কার্ড নেটওয়ার্ক যাচাই করা ডিভাইস টোকেন ট্রানজ্যাকশনের (CRYPTOGRAM_3DS) জন্য eciIndicator প্রদান করতে পারে।

আপনাকে অবশ্যই অনুমোদন ট্রানজ্যাকশনে eciIndicator ভ্যালু পাস করতে হবে, এটি পরিবর্তন বা হার্ডকোড করা যাবে না; অন্যথায়, ট্রানজ্যাকশন সম্পূর্ণ হবে না। নিচের সারণীতে eciIndicator-এর ভ্যালু বিস্তারিতভাবে দেওয়া হয়েছে।

eciIndicator ভ্যালু কার্ড নেটওয়ার্ক দায়িত্বপ্রাপ্ত পার্টি authMethod
""(empty) Mastercard মার্চেন্ট/অ্যাকোয়ারার CRYPTOGRAM_3DS
02 Mastercard কার্ড ইস্যুকারী CRYPTOGRAM_3DS
06 Mastercard মার্চেন্ট/অ্যাকোয়ারার CRYPTOGRAM_3DS
05 Visa কার্ড ইস্যুকারী CRYPTOGRAM_3DS
07 Visa মার্চেন্ট/অ্যাকোয়ারার CRYPTOGRAM_3DS
""(empty) অন্যান্য নেটওয়ার্ক মার্চেন্ট/অ্যাকোয়ারার CRYPTOGRAM_3DS

VISA এবং Mastercard-এর জন্য অন্য কোনও ECI ভ্যালু যা এই টেবিলে নেই তা ফেরত দেওয়া হবে না।

স্বাক্ষর যাচাইকরণ

ইন্টারমিডিয়েট কী ও মেসেজ সিগনেচার সহ সিগনেচার যাচাই করতে, নিম্নলিখিত আইটেমগুলি প্রয়োজন:

  • স্বাক্ষর তৈরি করতে ব্যবহৃত অ্যালগরিদম
  • স্বাক্ষর তৈরি করতে ব্যবহৃত বাইট-স্ট্রিং
  • স্বাক্ষর তৈরি করতে ব্যবহৃত ব্যক্তিগত কী-এর সাথে সম্পর্কিত পাবলিক কী
  • স্বাক্ষরটি নিজেই

স্বাক্ষর সম্পর্কিত অ্যালগরিদম

Google, Elliptic Curve Digital Signature Algorithm (ECDSA) ব্যবহার করে নিম্নলিখিত প্যারামিটার সহ মেসেজে স্বাক্ষর করে: FIPS 186-4-এ যেমন উল্লেখ করা আছে, হ্যাশ ফাংশন হিসেবে SHA-256 সহ NIST P-256-এর উপর ECDSA।

স্বাক্ষর

মেসেজের সবচেয়ে বাইরের লেভেলে স্বাক্ষর অন্তর্ভুক্ত করা হয়েছে। এটি ASN.1 বাইট ফর্ম্যাটে base64-এর মাধ্যমে এনকোড করা হয়েছে। ASN.1 সম্পর্কে আরও তথ্যের জন্য, IETF টুলস পরিশিষ্ট A দেখুন। স্বাক্ষরে ECDSA পূর্ণসংখ্যা r এবং s থাকে। আরও তথ্যের জন্য, সিগনেচার জেনারেশন অ্যালগরিদম দেখুন।

নিচে নির্দিষ্ট করা ASN.1 বাইট ফর্ম্যাটের উদাহরণ দেওয়া হল, এটি Java Cryptography Extension (JCE) ECDSA ইমপ্লিমেন্টেশনের মাধ্যমে তৈরি করা স্ট্যান্ডার্ড ফর্ম্যাট।

ECDSA-Sig-Value :: = SEQUENCE {
 r INTEGER,
 s INTEGER
}

ইন্টারমিডিয়েট সাইনিং কী সিগনেচারের জন্য কীভাবে বাইট-স্ট্রিং তৈরি করতে হয়

স্যাম্পেল পেমেন্ট পদ্ধতি টোকেনে ইন্টারমিডিয়েট সাইনিং কী সিগনেচার যাচাই করতে, নিম্নলিখিত ফর্মুলা ব্যবহার করে signedStringForIntermediateSigningKeySignature তৈরি করুন:

signedStringForIntermediateSigningKeySignature =
length_of_sender_id || sender_id || length_of_protocol_version || protocol_version || length_of_signed_key || signed_key

"||" নোটেশন মানে হল কনক্যাটিনেট করা। প্রতিটি কম্পোনেন্ট—sender_id, protocolVersion, signedKey—UTF-8 এনকোড করা হতে হবে। signedKey অবশ্যই intermediateSigningKey.signedKey-এর স্ট্রিং হতে হবে। প্রতিটি কম্পোনেন্টের বাইট দৈর্ঘ্য লিটল-এন্ডিয়ান ফর্ম্যাটে ৪ বাইট।

উদাহরণ

এই উদাহরণে নিম্নলিখিত স্যাম্পেল পেমেন্ট পদ্ধতি টোকেন ব্যবহার করা হয়েছে:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

sender_id সবসময় Google এবং protocol_version হল ECv2।

sender_id যদি Google হয়, তাহলে signedString নিম্নলিখিত উদাহরণের মতো দেখানো হয়:

signedStringForIntermediateSigningKeySignature =
\x06\x00\x00\x00 || Google || | \x04\x00\x00\x00 || ECv2 || \xb5\x00\x00\x00 || {"keyExpiration":"1542323393147","keyValue":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\u003d\u003d"}

signedStringForIntermediateSigningKeySignature-এ কীভাবে স্বাক্ষর যাচাই করবেন

ইন্টারমিডিয়েট সাইনিং কী স্বাক্ষরের জন্য সাইন করা স্ট্রিং অ্যাসেম্বল করার সময় স্ট্যান্ডার্ড ECDSA যাচাইকরণ অ্যালগরিদম ব্যবহার করা হয়। ECv2 প্রোটোকলের জন্য, আপনাকে intermediateSigningKey.signatures-এ সবকটি স্বাক্ষর পুনরাবৃত্তি করতে হবে এবং keys.json-এ মেয়াদ শেষ না হওয়া Google সাইনিং কী-এর মাধ্যমে প্রতিটি যাচাই করার চেষ্টা করতে হবে। অন্তত একটি স্বাক্ষর যাচাইকরণ কাজ করলে, যাচাইকরণ সম্পূর্ণ হয়েছে বলে বিবেচনা করুন। signedStringForMessageSignature যাচাই করতে পরে intermediateSigningKey.signedKey.keyValue ব্যবহার করুন। Google আপনাকে নিজের যাচাইকরণ কোডের পরিবর্তে আগে থেকে আছে এমন ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করার জন্য বিশেষভাবে সাজেস্ট করে।

মেসেজ স্বাক্ষরের জন্য কীভাবে বাইট-স্ট্রিং তৈরি করতে হয়

স্যাম্পেল পেমেন্ট পদ্ধতি টোকেনে স্বাক্ষর যাচাই করতে, নিম্নলিখিত ফর্মুলা ব্যবহার করে signedStringForMessageSignature তৈরি করুন:

signedStringForMessageSignature =
length_of_sender_id || sender_id || length_of_recipient_id || recipient_id || length_of_protocolVersion || protocolVersion || length_of_signedMessage || signedMessage

"||" নোটেশন মানে হল কনক্যাটিনেট করা। প্রতিটি কম্পোনেন্ট—sender_id, recipient_id, protocolVersion, signedMessage—UTF-8 এনকোড করা হতে হবে। প্রতিটি কম্পোনেন্টের বাইট দৈর্ঘ্য লিটল-এন্ডিয়ান ফর্ম্যাটে ৪ বাইট। বাইট স্ট্রিং তৈরি করার সময়, signedMessage পার্স বা পরিবর্তন করবেন না। যেমন, \u003d-এর জায়গায় = অক্ষর ব্যবহার করবেন না।

উদাহরণ

নিচের উদাহরণটি হল পেমেন্ট পদ্ধতির টোকেনের স্যাম্পেল:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

sender_id সবসময় Google এবং recipient_id হল merchant:merchantId। প্রোডাকশন অ্যাক্সেস সহ মার্চেন্টদের জন্য merchantId-এর সাথে Google Pay ও Wallet Console-এ পাওয়া ভ্যালু ম্যাচ করে।

sender_id যদি Google হয় এবং recipient_id যদি merchant:12345 হয়, তাহলে signedString নিম্নলিখিত উদাহরণের মতো দেখানো হয়:

signedStringForMessageSignature =
\x06\x00\x00\x00 || Google || \x0e\x00\x00\x00 || merchant:12345 || | \x04\x00\x00\x00 || ECv2 || \xd2\x00\x00\x00 || {"tag":"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\u003d","ephemeralPublicKey":"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\u003d","encryptedMessage":"mKOoXwi8OavZ"}

signedStringForMessageSignature-এ কীভাবে স্বাক্ষর যাচাই করবেন

স্বাক্ষরিত স্ট্রিং অ্যাসেম্বল করার সময় স্ট্যান্ডার্ড ECDSA যাচাইকরণ অ্যালগরিদম ব্যবহার করা হয়। আগের ধাপে যাচাই করা intermediateSigningKey.signedKey.keyValue, signedMessage যাচাই করার জন্য ব্যবহার করা হয়। Google আপনাকে নিজের যাচাইকরণ কোডের পরিবর্তে আগে থেকে আছে এমন ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করার জন্য বিশেষভাবে সাজেস্ট করে।

এনক্রিপশন স্কিম স্পেসিফিকেশন

Google Pay API রেসপন্সে ফেরত পাঠানো পেমেন্ট পদ্ধতি টোকেন সুরক্ষিত করতে Google 'ইলিপটিক কার্ভ ইন্টিগ্রেটেড এনক্রিপশন স্কিম (ECIES)' ব্যবহার করে। এনক্রিপশন স্কিম নিম্নলিখিত প্যারামিটার ব্যবহার করে:

প্যারামিটার সংজ্ঞা
কী এনক্যাপসুলেশন পদ্ধতি

ECIES-KEM, ISO 18033-2-এ যেমন উল্লেখ করা আছে।

  • ইলিপটিক কার্ভ: NIST P-256 (OpenSSL-এ prime256v1 নামেও পরিচিত)।
  • CheckMode, OldCofactorMode, SingleHashMode এবং CofactorMode হল 0.
  • পয়েন্ট ফর্ম্যাট আনকমপ্রেসড।
কী ডেরিভেশন ফাংশন

SHA-256 (HKDFwithSHA256) সহ HMAC-ভিত্তিক।

  • সল্ট দেওয়া যাবে না।
  • প্রোটোকল ভার্সন ECv2-এর জন্য তথ্য অবশ্যই "Google" হতে হবে, যা ASCII-তে এনকোড করা হবে।
  • AES256 কী-এর জন্য ২৫৬ বিট এবং HMAC_SHA256 কী-এর জন্য আরও ২৫৬ বিট ড্রাইভ করতে হবে।
সিমেট্রিক এনক্রিপশন অ্যালগরিদম

DEM2, ISO 18033-2-এ যেমন সংজ্ঞায়িত করা হয়েছে

এনক্রিপশন অ্যালগরিদম: জিরো IV সহ AES-256-CTR এবং প্যাড করা নয়।

MAC অ্যালগরিদম কী ডেরিভেশন ফাংশন থেকে প্রাপ্ত ২৫৬-বিট কী সহ HMAC_SHA256।

এনক্রিপশন সর্বজনীন কী ফর্ম্যাট

এনক্রিপশন সর্বজনীন কী এবং Google পে-লোডে ফেরত পাঠানো ephemeralPublicKey আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে কীয়ের base64 উপস্থাপনার সাথে ফর্ম্যাট করা হয়। এতে নিম্নলিখিত দুটি এলিমেন্ট থাকে:

  • একটি ম্যাজিক নম্বর যা ফর্ম্যাট (0x04) নির্দিষ্ট করে।
  • দুটি ৩২-বাইট বড় পূর্ণসংখ্যা যা উপবৃত্তাকার বক্ররেখায় X এবং Y স্থানাঙ্ককে দেখায়।

এই ফর্ম্যাটটি "Public Key Cryptography For The Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)," ANSI X9.62, 1998-এ আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।

পাবলিক কী জেনারেট করতে OpenSSL ব্যবহার করা

ধাপ ১: ব্যক্তিগত 'কী' তৈরি করা

নিম্নলিখিত উদাহরণটি NIST P-256-এর সাথে ব্যবহারের জন্য উপযুক্ত একটি উপবৃত্তাকার বক্ররেখা ব্যক্তিগত কী তৈরি করে এবং এটি key.pem-এ লেখে:

openssl ecparam -name prime256v1 -genkey -noout -out key.pem

ঐচ্ছিক: ব্যক্তিগত ও সর্বজনীন 'কী' দেখুন

ব্যক্তিগত ও সর্বজনীন কী দেখতে এই কমান্ড ব্যবহার করুন:

openssl ec -in key.pem -pubout -text -noout

কমান্ডটি নিম্নলিখিত আউটপুটের মতো একটি আউটপুট তৈরি করে:

read EC key
Private-Key: (256 bit)
priv:
    08:f4:ae:16:be:22:48:86:90:a6:b8:e3:72:11:cf:
    c8:3b:b6:35:71:5e:d2:f0:c1:a1:3a:4f:91:86:8a:
    f5:d7
pub:
    04:e7:68:5c:ff:bd:02:ae:3b:dd:29:c6:c2:0d:c9:
    53:56:a2:36:9b:1d:f6:f1:f6:a2:09:ea:e0:fb:43:
    b6:52:c6:6b:72:a3:f1:33:df:fa:36:90:34:fc:83:
    4a:48:77:25:48:62:4b:42:b2:ae:b9:56:84:08:0d:
    64:a1:d8:17:66
ASN1 OID: prime256v1

ধাপ ২: base64-এনকোড করা সর্বজনীন কী জেনারেট করা

আগের ঐচ্ছিক ধাপে তৈরি করা ব্যক্তিগত ও সর্বজনীন কী উদাহরণ হল হেক্সাডেসিমাল-এনকোডেড। আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে base64-এনকোড করা সর্বজনীন কী পেতে, এই কমান্ড ব্যবহার করুন:

openssl ec -in key.pem -pubout -text -noout 2> /dev/null | grep "pub:" -A5 | sed 1d | xxd -r -p | base64 | paste -sd "\0" - | tr -d '\n\r ' > publicKey.txt

কমান্ডটি একটি publicKey.txt ফাইল তৈরি করে যার কন্টেন্ট, আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে কী-এর base64 ভার্সন, নিম্নলিখিতটির মতো:

BOdoXP+9Aq473SnGwg3JU1aiNpsd9vH2ognq4PtDtlLGa3Kj8TPf+jaQNPyDSkh3JUhiS0KyrrlWhAgNZKHYF2Y=

ফাইলের কন্টেন্টে অতিরিক্ত খালি স্পেস বা নতুন লাইন থাকলে চলবে না। এটি যাচাই করতে, Linux বা MacOS-এ নিম্নলিখিত কমান্ড রান করুন:

od -bc publicKey.txt

ধাপ ৩: PKCS #8 ফর্ম্যাটে base64-এনকোড করা ব্যক্তিগত কী তৈরি করুন

Tink লাইব্রেরি আশা করে যে আপনার ব্যক্তিগত কী PKCS #8 ফর্ম্যাটে base64-এনকোড করা হবে। প্রথম ধাপে তৈরি করা ব্যক্তিগত কী থেকে এই ফর্ম্যাটে ব্যক্তিগত কী তৈরি করতে নিম্নলিখিত কমান্ড ব্যবহার করুন:

openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -nocrypt | base64 | paste -sd "\0" -

কমান্ডটি নিম্নলিখিত আউটপুটের মতো একটি আউটপুট তৈরি করে:

MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWV4oK8c/MZkCLk4qSCNjW0Zm6H0CBCtSYxkXkC9FBHehRANCAAQPldOnhO2/oXjdJD1dwlFPiNs6fcdoRgFu3/Z0iKj24SjTGyLRGAtYWLGXBZcDdPj3T2bJRHRVhE8Bc2AjkT7n

পেমেন্ট পদ্ধতি টোকেন কীভাবে ডিক্রিপ্ট করতে হয়

টোকেন ডিক্রিপ্ট করতে এইসব ধাপ অনুসরণ করুন:

  1. আপনার ব্যক্তিগত কী এবং প্রদত্ত ephemeralPublicKey ব্যবহার করে ৫১২-বিট দীর্ঘ শেয়ার করা কী তৈরি করুন যা ECIES-KEM ব্যবহার করে। নিম্নলিখিত প্যারামিটার ব্যবহার করুন:
    • ইলিপটিক কার্ভ: NIST P-256, যা OpenSSL-এ prime256v1 নামেও পরিচিত।
    • CheckMode, OldCofactorMode, SingleHashMode এবং CofactorMode হল 0।
    • এনকোডিং ফাংশন: আনকম্প্রেসড পয়েন্ট ফর্ম্যাট।
    • কী ডেরিভেশন ফাংশন: HKDFwithSHA256, RFC 5869-এ যেমন বর্ণনা করা হয়েছে, নিম্নলিখিত প্যারামিটার সহ:
      • সল্ট দেওয়া যাবে না। RFC অনুযায়ী, এটি অবশ্যই ৩২টি জিরোয়েড বাইটের সল্টের সমতুল্য হতে হবে।
  2. জেনারেট করা 'কী' দুটি ২৫৬-বিট-লম্বা 'কী'-তে স্প্লিট করুন: symmetricEncryptionKey এবং macKey।
  3. tag ফিল্ডটি encryptedMessage-এর জন্য সঠিক MAC কিনা তা যাচাই করুন।

    প্রত্যাশিত MAC তৈরি করতে, হ্যাশ ফাংশন SHA256 এবং ধাপ ২-এ পাওয়া macKey-এর সাথে HMAC (RFC 5869) ব্যবহার করুন।

  4. AES-256-CTR মোড এবং নিম্নলিখিত বিকল্প ব্যবহার করে encryptedMessage ডিক্রিপ্ট করুন:

    • একটি শূন্য IV।
    • প্যাড করা নেই।
    • ধাপ ২-এ symmetricEncryptionKey পাওয়া গেছে।

কী ম্যানেজমেন্ট

মার্চেন্ট এনক্রিপশন কী

এনক্রিপশন স্কিম স্পেসিফিকেশন-এ উল্লেখ করা স্পেসিফিকেশন অনুযায়ী মার্চেন্টরা সর্বজনীন কী তৈরি করেন।

Google রুট সাইনিং 'কী'

Google বর্তমানে বৈধ রুট সাইনিং সর্বজনীন কী-এর সেট প্রকাশ করে যা সর্বজনীন URL থেকে ফেচ করা যায়। URL-এর মাধ্যমে ফেরত পাঠানো HTTP ক্যাশে হেডারের নির্দেশ অনুযায়ী যতক্ষণ পর্যন্ত 'কী' কাজ করবে ততক্ষণ পর্যন্ত তা বৈধ থাকবে। মেয়াদ শেষ না হওয়া পর্যন্ত এগুলি ক্যাশে করা হয়, যা keyExpiration ফিল্ডের মাধ্যমে নির্ধারণ করা হয়। আমরা সাজেস্ট করি যে ফেচ করার মেয়াদ শেষ হয়ে গেলে, সর্বজনীন URL থেকে আবার 'কী' ফেচ করুন যাতে সঠিক 'কী'-এর বর্তমান তালিকা পাওয়া যায়।

ECv2 প্রোটোকলের জন্য ব্যতিক্রম: রানটাইমে Google থেকে 'কী' আনতে না পারলে, আমাদের প্রোডাকশন URL থেকে keys.json আনুন, আপনার সিস্টেমে সেভ করুন এবং নির্দিষ্ট সময় অন্তর ম্যানুয়ালি রিফ্রেশ করুন। সাধারণত, Google, ECv2-এর জন্য নতুন রুট সাইনিং কী ইস্যু করে, যে কী-এর মেয়াদ শেষ হওয়ার তারিখ সবচেয়ে বেশি, তার মেয়াদ শেষ হওয়ার পাঁচ বছর আগে। কী কম্প্রোমাইজ হলে, Google keys.json দ্রুত রিলোড করার অনুরোধ জানাতে সেল্ফ-সার্ভিস পোর্টালে দেওয়া যোগাযোগের তথ্যের মাধ্যমে সব মার্চেন্টকে বিজ্ঞপ্তি পাঠায়। নিয়মিত রোটেশন যাতে মিস না হয় তা নিশ্চিত করতে, আমরা সাজেস্ট করি যে যেসব মার্চেন্ট keys.json-এর কন্টেন্টে Google কী সেভ করার বিকল্প বেছে নেন, তারা যেন নিজেদের বার্ষিক কী রোটেশনের অংশ হিসেবে প্রতি বছর রিফ্রেশ করেন।

পাবলিক URL-এর মাধ্যমে প্রদান করা কী নিম্নলিখিত ফর্ম্যাটে ম্যাপ করা হয়:

{
  "keys": [
    {
      "keyValue": "encoded public key",
      "protocolVersion": "ECv2"
      "keyExpiration":"2000000000000"
    },
    {
      "keyValue": "encoded public key",
      "protocolVersion": "ECv2"
      "keyExpiration":"3000000000000"
    }
  ]
}

keyValue হল base64, র‍্যাপ বা প্যাড করা নয়, ASN.1-এ এনকোড করা 'কী'-এর ভার্সন টাইপ SubjectPublicKeyInfo X.509 স্ট্যান্ডার্ডে সংজ্ঞায়িত। Java-তে, উল্লেখ করা ASN.1 এনকোডিং X509EncodedKeySpec ক্লাস দ্বারা উপস্থাপিত হয়। এটি ECPublicKey.getEncoded()-এর মাধ্যমে পাওয়া যেতে পারে।

টেস্ট ও প্রোডাকশন এনভায়রনমেন্টের URL নিচে দেওয়া লিঙ্কে উপলভ্য:

কী রোটেশন

আপনি যদি সরাসরি ইন্টিগ্রেশনের মাধ্যমে আপনার সার্ভারে সরাসরি পেমেন্ট পদ্ধতির টোকেন ডিক্রিপ্ট করেন, তাহলে আপনাকে প্রতি বছর কী পরিবর্তন করতে হবে।

এনক্রিপশন কী রোটেট করতে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. নতুন কী পেয়ার তৈরি করতে OpenSSL ব্যবহার করুন।
  2. Google Pay-এর জন্য ডেভেলপার হিসেবে সাইন-আপ করতে আগে যে Google অ্যাকাউন্ট ব্যবহার করেছিলেন, সেটি দিয়ে সাইন-ইন করে Google Pay ও Wallet Console খুলুন।
  3. Google Pay API ট্যাবে, সরাসরি ইন্টিগ্রেশন প্যানে, আপনার আগে থেকে থাকা পাবলিক কী-এর পাশে ম্যানেজ করুন বিকল্পে ক্লিক করুন। অন্য একটি 'কী' যোগ করুন বিকল্পে ক্লিক করুন।
  4. সর্বজনীন এনক্রিপশন কী টেক্সট ইনপুট ফিল্ড বেছে নিন এবং আপনার নতুন তৈরি করা সর্বজনীন কী আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে base64-এনকোড করা হিসেবে যোগ করুন।
  5. এনক্রিপশন কী সেভ করুন বিকল্পে ক্লিক করুন।
  6. 'কী' রোটেশন যাতে নির্বিঘ্নে হয় তা নিশ্চিত করতে, 'কী' ট্রানজিশন করার সময় নতুন ও পুরনো ব্যক্তিগত 'কী' ডিক্রিপশন, দুটিকেই সাপোর্ট করুন।

    আপনি যদি টোকেন ডিক্রিপ্ট করতে Tink লাইব্রেরি ব্যবহার করেন, তাহলে একাধিক ব্যক্তিগত কী-এর জন্য নিম্নলিখিত জাভা কোড ব্যবহার করুন:

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
            .addRecipientPrivateKey(newPrivateKey)
            .addRecipientPrivateKey(oldPrivateKey);

    ডিক্রিপশনের কোড প্রোডাকশনে ডিপ্লয় করা হয়েছে কিনা এবং আপনি সফল ডিক্রিপশন মনিটর করছেন কিনা তা নিশ্চিত করুন।

  7. আপনার কোডে ব্যবহৃত পাবলিক কী পরিবর্তন করুন।

    PaymentMethodTokenizationSpecification parameters প্রপার্টিতে publicKey অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করুন:

    const tokenizationSpecification = {
      "type": "DIRECT",
      "parameters": {
        "protocolVersion": "ECv2",
        "publicKey": "BOdoXP1aiNp.....kh3JUhiSZKHYF2Y="
      }
    }
  8. প্রোডাকশনে ৪ নম্বর ধাপ থেকে কোড ডিপ্লয় করুন। কোড ডিপ্লয় করা হয়ে গেলে, এনক্রিপশন ও ডিক্রিপশন ট্রানজ্যাকশন নতুন কী পেয়ার ব্যবহার করে।
  9. কোনও ট্রানজ্যাকশন এনক্রিপ্ট করার জন্য পুরনো পাবলিক কী আর ব্যবহার করা হচ্ছে না তা কনফার্ম করুন।

  10. পুরনো ব্যক্তিগত কী সরিয়ে দিন।
  11. Google Pay-তে ডেভেলপার হিসেবে সাইন-আপ করার জন্য আগে যে Google অ্যাকাউন্ট ব্যবহার করেছিলেন, সেটি দিয়ে সাইন-ইন করে Google Pay ও Wallet Console খুলুন।
  12. Google Pay API ট্যাবে, সরাসরি ইন্টিগ্রেশন প্যানে, আপনার আগে থেকে থাকা পাবলিক কী-এর পাশে ম্যানেজ করুন বিকল্পে ক্লিক করুন। আপনার পুরনো পাবলিক কী-এর পাশে মুছুন বিকল্পে ক্লিক করুন এবং এনক্রিপশন কী সেভ করুন বিকল্পে ক্লিক করুন।

Google, PaymentMethodTokenizationSpecification parameters অবজেক্টের মধ্যে publicKey প্রপার্টিতে নির্দিষ্ট করা কী ব্যবহার করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

{
  "protocolVersion": "ECv2",
  "publicKey": "BOdoXP+9Aq473SnGwg3JU1..."
}

এনক্রিপ্ট করা উত্তর ম্যানেজ করতে Tink লাইব্রেরি ব্যবহার করুন

স্বাক্ষর যাচাইকরণ এবং মেসেজ ডিক্রিপশন করতে, Tink paymentmethodtoken লাইব্রেরি ব্যবহার করুন। এই লাইব্রেরি শুধুমাত্র Java-তে উপলভ্য। এটি ব্যবহার করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. আপনার pom.xml-এ, Tink paymentmethodtoken অ্যাপকে ডিপেন্ডেন্সি হিসেবে যোগ করুন:

    <dependencies>
      <!-- other dependencies ... -->
      <dependency>
        <groupId>com.google.crypto.tink</groupId>
        <artifactId>apps-paymentmethodtoken</artifactId>
        <version>1.9.1</version>  <!-- or latest version -->
      </dependency>
    </dependencies>
  2. সার্ভার চালু করার সময়, মেমরিতে 'কী' উপলভ্য করতে Google সাইনিং 'কী' প্রিফেচ করুন। ডিক্রিপশন প্রসেস কী নিয়ে আসার সময় এটি ব্যবহারকারীকে নেটওয়ার্ক লেটেন্সি দেখতে দেয় না।

    GooglePaymentsPublicKeysManager.INSTANCE_PRODUCTION.refreshInBackground();
  3. নিম্নলিখিত কোড ব্যবহার করে মেসেজ ডিক্রিপ্ট করুন, যেখানে ধরে নেওয়া হয়েছে যে paymentMethodToken encryptedMessage ভেরিয়েবলে স্টোর করা আছে এবং আপনার পরিস্থিতি অনুযায়ী বোল্ড করা অংশ পরিবর্তন করুন।

    নন-প্রোডাকশন টেস্টের জন্য, INSTANCE_PRODUCTION-এর পরিবর্তে INSTANCE_TEST ব্যবহার করুন এবং আপনার ইন্টিগ্রেশন অ্যাক্টিভ না থাকলে বা এনক্রিপশন কী কনফিগার করা না থাকলে, [YOUR MERCHANT ID]-এর পরিবর্তে 12345678901234567890 ব্যবহার করুন।

    • অ্যাক্টিভ
    • সরাসরি ইন্টিগ্রেশন চালু করা আছে
    • এনক্রিপশন কী কনফিগার করা আছে

    [YOUR MERCHANT ID] পরিবর্তন করবেন না।

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
        .fetchSenderVerifyingKeysWith(
            GooglePaymentsPublicKeysManager.INSTANCE_PRODUCTION)
        .recipientId("merchant:[YOUR MERCHANT ID]")
        // This guide applies only to protocolVersion = ECv2
        .protocolVersion("ECv2")
        // Multiple private keys can be added to support graceful
        // key rotations.
        .addRecipientPrivateKey(PrivateKey1)
        .addRecipientPrivateKey(PrivateKey2)
        .build()
        .unseal(encryptedMessage);
  4. PrivateKey1-এর পরিবর্তে উপযুক্ত ব্যক্তিগত কী ভ্যালু লিখুন যা আপনার কী প্রস্তুত করুন এবং Google-এ রেজিস্টার করুন থেকে Google-এ রেজিস্টার করা সর্বজনীন কী ভ্যালুর সাথে যুক্ত। পরে আপনি একাধিক অন্যান্য ব্যক্তিগত কী ভ্যালু যোগ করতে পারবেন যখন আপনাকে Google-এর সাথে কী রোটেট করতে হবে। ভেরিয়েবেলগুলি হয় base64-এনকোড করা PKCS8 স্ট্রিং অথবা একটি ECPrivateKey অবজেক্ট হতে পারে। base64-এনকোড করা PKCS8 ব্যক্তিগত কী কীভাবে তৈরি করবেন সেই সম্পর্কে আরও তথ্যের জন্য, আপনার কী তৈরি করুন এবং Google-এ রেজিস্টার করুন দেখুন।

  5. আপনি প্রতিবার 'কী' ডিক্রিপ্ট করার সময় Google সার্ভারে কল করতে না পারলে, নিম্নলিখিত কোড ব্যবহার করে ডিক্রিপ্ট করুন এবং আপনার পরিস্থিতি অনুযায়ী বোল্ড করা অংশগুলি পরিবর্তন করুন।

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
        .addSenderVerifyingKey("ECv2 key fetched from test or production url")
        .recipientId("merchant:[YOUR MERCHANT ID]")
        // This guide applies only to protocolVersion = ECv2
        .protocolVersion("ECv2")
        // Multiple private keys can be added to support graceful
        // key rotations.
        .addRecipientPrivateKey(PrivateKey1)
        .addRecipientPrivateKey(PrivateKey2)
        .build()
        .unseal(encryptedMessage);

    প্রোডাকশন এনভায়রনমেন্টে বর্তমান 'কী' 04/14/2038 পর্যন্ত বৈধ, তবে 'কী' সংক্রান্ত কোনও সমস্যা হলে এই সময়সীমা প্রযোজ্য হবে না। কী কম্প্রোমাইজ হলে, Google সব মার্চেন্টকে সেল্ফ-সার্ভিস পোর্টালে দেওয়া যোগাযোগের তথ্যের মাধ্যমে বিজ্ঞপ্তি পাঠায় যাতে keys.json দ্রুত রিলোড করার অনুরোধ করা যায়।

    কোড স্নিপেট নিম্নলিখিত নিরাপত্তা সংক্রান্ত বিবরণ ম্যানেজ করে যাতে আপনি পেলোড ব্যবহারের উপর ফোকাস করতে পারেন:

    • Google সাইনিং কী ফেচ করা হয়েছে এবং মেমরিতে ক্যাশে করা হয়েছে
    • স্বাক্ষর যাচাইকরণ
    • ডিক্রিপশন