कारोबारियों या कंपनियों के लिए पेमेंट डेटा क्रिप्टोग्राफ़ी

Google Pay API, पेमेंट के तरीकों को साइन किए गए और एन्क्रिप्ट किए गए PaymentMethodToken पेलोड में दिखाता है. वापस किए गए पेमेंट के तरीकों में, ऐसे कार्ड शामिल होते हैं जिनमें पैन होता है या टोकन वाले ऐसे कार्ड शामिल होते हैं जिनमें डिवाइस पैन और क्रिप्टोग्राम होते हैं.

पेलोड में protocolVersion नाम का एक फ़ील्ड होता है. इससे पेलोड पाने वाले को यह पता चलता है कि कौनसे क्रिप्टोग्राफ़िक प्रिमिटिव इस्तेमाल किए जा रहे हैं और उनका फ़ॉर्मैट क्या है.

इस गाइड में, Google के हस्ताक्षर वाले और एन्क्रिप्ट (सुरक्षित) किए गए पेमेंट के तरीके के टोकन का अनुरोध करने के लिए, सार्वजनिक पासकोड जनरेट करने का तरीका बताया गया है. साथ ही, टोकन की पुष्टि करने और उसे डिक्रिप्ट करने का तरीका भी बताया गया है.

यह गाइड सिर्फ़ protocolVersion = ECv2 पर लागू होती है.

आपको पेमेंट के लिए इस्तेमाल होने वाले कार्ड की जानकारी सीधे तौर पर मिलती है. इसलिए, आगे बढ़ने से पहले पक्का करें कि आपका ऐप्लिकेशन, पीसीआई डीएसएस के मुताबिक हो. साथ ही, आपके सर्वर के पास उपयोगकर्ता के पेमेंट क्रेडेंशियल को सुरक्षित तरीके से मैनेज करने के लिए ज़रूरी इन्फ़्रास्ट्रक्चर हो.

यहां बताया गया है कि Google Pay API ECv2 PaymentMethodToken पेलोड का इस्तेमाल करने के लिए, इंटिग्रेटर को क्या करना चाहिए:

  1. Google रूट साइनिंग पासकोड फ़ेच करें.
  2. पुष्टि करें कि इंटरमीडिएट साइनिंग पासकोड का हस्ताक्षर, किसी भी ऐसे रूट साइनिंग पासकोड से मान्य है जिसकी समयसीमा खत्म नहीं हुई है.
  3. पुष्टि करें कि पेलोड की इंटरमीडिएट साइनिंग पासकोड की समयसीमा खत्म न हुई हो.
  4. पुष्टि करें कि पेलोड का हस्ताक्षर, इंटरमीडिएट साइनिंग पासकोड के हिसाब से मान्य है.
  5. हस्ताक्षर की पुष्टि करने के बाद, पेलोड के कॉन्टेंट को डिक्रिप्ट करें.
  6. पुष्टि करें कि मैसेज की समयसीमा खत्म न हुई हो. इसके लिए, आपको यह देखना होगा कि मौजूदा समय, डिक्रिप्ट किए गए कॉन्टेंट में मौजूद messageExpiration फ़ील्ड से कम हो.
  7. डिक्रिप्ट किए गए कॉन्टेंट में मौजूद पेमेंट के तरीके का इस्तेमाल करें और शुल्क लें.

हमारी Tink लाइब्रेरी में मौजूद सैंपल कोड, पहले से छठे चरण तक की प्रोसेस को पूरा करता है.

पेमेंट के तरीके के टोकन का स्ट्रक्चर

PaymentData रिस्पॉन्स में Google से मिला मैसेज, UTF-8 कोड में बदला गया और क्रम में लगाया गया JSON ऑब्जेक्ट होता है. इसमें नीचे दी गई टेबल में बताई गई कुंजियां होती हैं:

नाम टाइप ब्यौरा
protocolVersion स्ट्रिंग इससे उस एन्क्रिप्शन या साइनिंग स्कीम की पहचान होती है जिसके तहत मैसेज बनाया गया है. इससे, ज़रूरत पड़ने पर प्रोटोकॉल को समय के साथ बेहतर बनाया जा सकता है.
signature स्ट्रिंग यह पुष्टि करता है कि मैसेज Google से आया है. यह base64-कोड में बदला गया है. साथ ही, इसे इंटरमीडिएट साइनिंग कुंजी की मदद से, ईसीडीएसए से बनाया गया है.
intermediateSigningKey ऑब्जेक्ट एक JSON ऑब्जेक्ट, जिसमें Google की इंटरमीडिएट साइनिंग कुंजी शामिल होती है. इसमें keyValue, keyExpiration, और signatures के साथ signedKey शामिल है. इसे क्रम से लगाया जाता है, ताकि इंटरमीडिएट साइनिंग पासकोड के हस्ताक्षर की पुष्टि की प्रक्रिया को आसान बनाया जा सके.
signedMessage स्ट्रिंग एचटीएमएल-सेफ़ स्ट्रिंग के तौर पर सीरियलाइज़ किया गया 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-एन्कोडेड है और इसे ईसीडीएसए की मदद से बनाया गया है.

साइन किया गया पासकोड

signedKey, UTF-8 कोड में बदला गया, सीरियलाइज़ किया गया JSON ऑब्जेक्ट है. इसमें ये वैल्यू शामिल होती हैं:

नाम टाइप ब्यौरा
keyValue स्ट्रिंग ASN.1 टाइप में कोड में बदली गई कुंजी का base64 वर्शन. SubjectPublicKeyInfo को X.509 स्टैंडर्ड में तय किया गया है.
keyExpiration स्ट्रिंग इंटरमीडिएट कुंजी की समयसीमा खत्म होने की तारीख और समय. इसे Epoch के बाद से यूटीसी मिलीसेकंड के तौर पर दिखाया जाता है. इंटीग्रेटर, समयसीमा खत्म हो चुकी किसी भी कुंजी को अस्वीकार कर देते हैं.

हस्ताक्षर किया गया मैसेज

signedMessage, UTF-8 कोड में बदला गया, सीरियलाइज़ किया गया JSON ऑब्जेक्ट है. इसमें ये वैल्यू शामिल होती हैं:

नाम टाइप ब्यौरा
encryptedMessage स्ट्रिंग एन्क्रिप्ट (सुरक्षित) किया गया base64-कोड वाला मैसेज, जिसमें पेमेंट की जानकारी और कुछ अतिरिक्त सुरक्षा फ़ील्ड शामिल होते हैं.
ephemeralPublicKey स्ट्रिंग निजी पासकोड से जुड़ा, base64 कोड में बदला गया कुछ समय के लिए इस्तेमाल होने वाला सार्वजनिक पासकोड. इसका इस्तेमाल, मैसेज को एन्क्रिप्ट (सुरक्षित) करने के लिए किया जाता है. यह मैसेज, अनकंप्रेस्ड पॉइंट फ़ॉर्मैट में होता है. ज़्यादा जानकारी के लिए, एन्क्रिप्शन के लिए सार्वजनिक पासकोड का फ़ॉर्मैट देखें.
tag स्ट्रिंग encryptedMessage का base64-कोड में बदला गया मैक पता.

एन्क्रिप्ट (सुरक्षित) किया गया मैसेज

डिक्रिप्ट किया गया encryptedMessage, UTF-8 में एन्कोड किया गया और क्रम से लगाया गया JSON ऑब्जेक्ट है. JSON में दो लेवल होते हैं. बाहरी लेवल में मेटाडेटा और सुरक्षा के लिए शामिल किए गए फ़ील्ड होते हैं. वहीं, अंदरूनी लेवल एक अन्य JSON ऑब्जेक्ट होता है, जो पेमेंट के असल क्रेडेंशियल को दिखाता है.

encryptedMessage के बारे में ज़्यादा जानकारी के लिए, यहां दी गई टेबल और JSON ऑब्जेक्ट के उदाहरण देखें:

नाम टाइप ब्यौरा
messageExpiration स्ट्रिंग वह तारीख और समय जब मैसेज की समयसीमा खत्म हो जाती है. यह समय, epoch के बाद से यूटीसी मिलीसेकंड के तौर पर दिखाया जाता है. इंटिग्रेटर को ऐसे किसी भी मैसेज को अस्वीकार कर देना चाहिए जिसकी समयसीमा खत्म हो गई है.
messageId स्ट्रिंग एक यूनीक आईडी, जिससे मैसेज की पहचान की जाती है. ऐसा तब किया जाता है, जब मैसेज को वापस लेना हो या बाद में उसे ढूंढना हो.
paymentMethod स्ट्रिंग पेमेंट क्रेडेंशियल का टाइप. फ़िलहाल, सिर्फ़ CARD का इस्तेमाल किया जा सकता है.
paymentMethodDetails ऑब्जेक्ट पेमेंट क्रेडेंशियल. इस ऑब्जेक्ट का फ़ॉर्मैट, paymentMethod से तय होता है. इसके बारे में यहां दी गई टेबल में बताया गया है.

कार्ड

CARD पेमेंट के तरीके के लिए, ये क्रेडेंशियल ज़रूरी हैं:

नाम टाइप ब्यौरा
pan स्ट्रिंग निजी खाते का नंबर, जिससे शुल्क लिया गया. इस स्ट्रिंग में सिर्फ़ अंक होते हैं.
expirationMonth नंबर कार्ड की समयसीमा खत्म होने का महीना. इसमें 1 का मतलब जनवरी, 2 का मतलब फ़रवरी, और इसी तरह आगे के महीने हैं.
expirationYear नंबर कार्ड की समयसीमा खत्म होने का साल, चार अंकों में होना चाहिए. जैसे, 2020.
authMethod स्ट्रिंग कार्ड से किए गए लेन-देन की पुष्टि करने का तरीका.
merchantTokenId स्ट्रिंग

कार्ड से किए गए लेन-देन का मर्चेंट टोकन आईडी. यह वैकल्पिक फ़ील्ड सिर्फ़ तब दिखता है, जब यहां दी गई सभी शर्तें पूरी होती हैं:

  • कारोबारी या कंपनी, अनुरोध में एमआईटी *TransactionInfo ऑब्जेक्ट की जानकारी देती है.
  • कारोबारी या कंपनी, अनुरोध में tokenUpdateUrl शामिल करती है.
  • उपयोगकर्ता, टोकन वाला कोई इंस्ट्रूमेंट चुनता है. जैसे, डीपीएएन.

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 सिक्योर क्रिप्टोग्राम का इस्तेमाल करके प्रमाणित किया गया है, CRYPTOGRAM_3DS authMethod. इसमें ये अतिरिक्त फ़ील्ड शामिल होते हैं:

नाम टाइप ब्यौरा
cryptogram स्ट्रिंग 3-D Secure क्रिप्टोग्राम.
eciIndicator स्ट्रिंग यह स्ट्रिंग हमेशा मौजूद नहीं होती. यह सिर्फ़ Android (CRYPTOGRAM_3DS) पर पुष्टि किए गए डिवाइस टोकन के लेन-देन के लिए वापस आता है. इस वैल्यू को पेमेंट प्रोसेस करने के फ़्लो में पास करना ज़रूरी है.

यहां दिया गया JSON स्निपेट, CRYPTOGRAM_3DS authMethod वाले CARD paymentMethod के लिए, पूरे encryptedMessage का उदाहरण है:

{
  "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 के लिए, ईसीआई की ऐसी कोई भी वैल्यू नहीं दिखाई जाएगी जो इस टेबल में मौजूद नहीं है.

हस्ताक्षर की पुष्टि करना

सिग्नेचर की पुष्टि करने के लिए, ये चीज़ें ज़रूरी हैं. इनमें इंटरमीडिएट पासकोड और मैसेज के सिग्नेचर शामिल हैं:

  • हस्ताक्षर बनाने के लिए इस्तेमाल किया गया एल्गोरिदम
  • हस्ताक्षर बनाने के लिए इस्तेमाल की गई बाइट-स्ट्रिंग
  • हस्ताक्षर बनाने के लिए इस्तेमाल किए गए निजी पासकोड से जुड़ा सार्वजनिक पासकोड
  • हस्ताक्षर

हस्ताक्षर एल्गोरिदम

Google, मैसेज पर हस्ताक्षर करने के लिए एलिप्टिक कर्व डिजिटल सिग्नेचर एल्गोरिदम (ECDSA) का इस्तेमाल करता है. इसके लिए, इन पैरामीटर का इस्तेमाल किया जाता है: FIPS 186-4 में बताए गए तरीके के मुताबिक, हैश फ़ंक्शन के तौर पर SHA-256 के साथ NIST P-256 पर ECDSA.

हस्ताक्षर

हस्ताक्षर, मैसेज के सबसे बाहरी लेवल में शामिल होता है. इसे ASN.1 बाइट फ़ॉर्मैट में, base64 के साथ कोड में बदला जाता है. ASN.1 के बारे में ज़्यादा जानकारी के लिए, आईईटीएफ़ टूल का अपेंडिक्स A देखें. हस्ताक्षर में ईसीडीएसए इंटीजर r और s शामिल होते हैं. ज़्यादा जानकारी के लिए, सिग्नेचर जनरेट करने वाला एल्गोरिदम देखें.

यहां दिए गए उदाहरण में, ASN.1 बाइट फ़ॉर्मैट के बारे में बताया गया है. यह Java Cryptography Extension (जेसीई) ईसीडीएसए के लागू होने से बनने वाला स्टैंडर्ड फ़ॉर्मैट है.

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 पर हस्ताक्षर की पुष्टि करने का तरीका

जब इंटरमीडिएट साइनिंग पासकोड के हस्ताक्षर के लिए, साइन की गई स्ट्रिंग को असेंबल किया जाता है, तब पुष्टि करने के लिए स्टैंडर्ड ईसीडीएसए एल्गोरिदम का इस्तेमाल किया जाता है. 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 पर हस्ताक्षर की पुष्टि करने का तरीका

साइन की गई स्ट्रिंग को असेंबल करते समय, पुष्टि करने के लिए स्टैंडर्ड ईसीडीएसए एल्गोरिदम का इस्तेमाल किया जाता है. पिछले चरण में पुष्टि किए गए intermediateSigningKey.signedKey.keyValue का इस्तेमाल, signedMessage की पुष्टि करने के लिए किया जाता है. Google का सुझाव है कि आप पुष्टि करने के लिए खुद का कोड इस्तेमाल करने के बजाय, पहले से मौजूद क्रिप्टोग्राफ़िक लाइब्रेरी का इस्तेमाल करें.

एन्क्रिप्ट करने की स्कीम की जानकारी

Google, एलिप्टिक कर्व इंटिग्रेटेड एन्क्रिप्शन स्कीम (ECIES) का इस्तेमाल करता है. इससे, Google Pay API से मिले जवाब में मौजूद पेमेंट के तरीके के टोकन को सुरक्षित किया जाता है. एन्क्रिप्शन स्कीम में इन पैरामीटर का इस्तेमाल किया जाता है:

पैरामीटर परिभाषा
कुंजी को एनकैप्सुलेट करने का तरीका

ECIES-KEM, जैसा कि ISO 18033-2 में बताया गया है.

  • एलिप्टिक कर्व: NIST P-256 (इसे OpenSSL में prime256v1 भी कहा जाता है).
  • CheckMode, OldCofactorMode, SingleHashMode, और CofactorMode की वैल्यू 0 है.
  • पॉइंट फ़ॉर्मैट को कंप्रेस नहीं किया गया है.
की डेरिवेशन फ़ंक्शन

SHA-256 (HKDFwithSHA256) के साथ एचएमएसी पर आधारित.

  • सॉल्ट नहीं दिया जाना चाहिए.
  • जानकारी "Google" होनी चाहिए. साथ ही, प्रोटोकॉल वर्शन ECv2 के लिए, इसे ASCII में कोड में बदला गया हो.
  • AES256 कुंजी के लिए 256 बिट और HMAC_SHA256 कुंजी के लिए अन्य 256 बिट जनरेट किए जाने चाहिए.
सिमेट्रिक एन्क्रिप्शन एल्गोरिदम

DEM2, जैसा कि ISO 18033-2 में बताया गया है

एन्क्रिप्शन का एल्गोरिदम: AES-256-CTR, जिसमें शून्य IV है और पैडिंग नहीं की गई है.

मैक एल्गोरिदम HMAC_SHA256, जिसमें 256-बिट वाली कुंजी का इस्तेमाल किया जाता है. यह कुंजी, की डेरिवेशन फ़ंक्शन से जनरेट होती है.

एन्क्रिप्ट करने के लिए इस्तेमाल होने वाली सार्वजनिक कुंजी का फ़ॉर्मैट

एन्क्रिप्ट करने के लिए इस्तेमाल होने वाला सार्वजनिक पासकोड और Google पेलोड में दिखाया गया ephemeralPublicKey, बिना कंप्रेस किए गए पॉइंट फ़ॉर्मैट में पासकोड के base64 वर्शन के साथ फ़ॉर्मैट किया जाता है. इसमें ये दो एलिमेंट शामिल होते हैं:

  • फ़ॉर्मैट (0x04) बताने वाला एक मैजिक नंबर.
  • 32 बाइट के दो बड़े पूर्णांक, जो एलिप्टिक कर्व में 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 का इस्तेमाल करके, 512-बिट की शेयर की गई कुंजी बनाएं. यह कुंजी, ECIES-KEM का इस्तेमाल करती है. इन पैरामीटर का इस्तेमाल करें:
    • एलिप्टिक कर्व: NIST P-256, जिसे OpenSSL में prime256v1 के नाम से भी जाना जाता है.
    • CheckMode, OldCofactorMode, SingleHashMode, और CofactorMode, 0 हैं.
    • एन्कोडिंग फ़ंक्शन: अनकंप्रेस्ड पॉइंट फ़ॉर्मैट.
    • की डेरीवेशन फ़ंक्शन: HKDFwithSHA256, जैसा कि RFC 5869 में बताया गया है. इसमें यह पैरामीटर शामिल है:
      • सॉल्ट नहीं दिया जाना चाहिए. आरएफ़सी के मुताबिक, यह 32 ज़ीरो बाइट के सॉल्ट के बराबर होना चाहिए.
  2. जनरेट की गई कुंजी को 256-बिट वाली दो कुंजियों में बांटें: symmetricEncryptionKey और macKey.
  3. पुष्टि करें कि tag फ़ील्ड, encryptedMessage के लिए मान्य एमएसी है.

    ज़रूरी मैक जनरेट करने के लिए, हैश फ़ंक्शन SHA256 के साथ एचएमएसी (RFC 5869) और दूसरे चरण में मिले macKey का इस्तेमाल करें.

  4. AES-256-CTR मोड और नीचे दी गई जानकारी का इस्तेमाल करके, encryptedMessage को डिक्रिप्ट करें:

    • शून्य IV.
    • पैड नहीं लगे हैं.
    • दूसरे चरण में मिला symmetricEncryptionKey.

कुंजी मैनेज करना

व्यापारी/कंपनी/कारोबारी की एन्क्रिप्शन कुंजियां

कारोबारी या कंपनियां, एन्क्रिप्ट करने की स्कीम की खास जानकारी में बताई गई खास बातों के मुताबिक सार्वजनिक पासकोड जनरेट करती हैं.

Google रूट साइनिंग पासकोड

देखें.

Google, फ़िलहाल मान्य रूट साइनिंग सार्वजनिक पासकोड का सेट पब्लिश करता है. इसे किसी सार्वजनिक यूआरएल से फ़ेच किया जा सकता है. कुंजियां तब तक मान्य रहती हैं, जब तक यूआरएल से मिले एचटीटीपी कैश हेडर में बताया गया हो. इन्हें तब तक कैश मेमोरी में सेव किया जाता है, जब तक इनकी समयसीमा खत्म नहीं हो जाती. समयसीमा खत्म होने की जानकारी, keyExpiration फ़ील्ड से मिलती है. हमारा सुझाव है कि फ़ेच की समयसीमा खत्म होने पर, सार्वजनिक यूआरएल से कुंजियों को फिर से फ़ेच करें, ताकि आपको मान्य कुंजियों की मौजूदा सूची मिल सके.

ECv2 प्रोटोकॉल के लिए अपवाद: अगर रनटाइम के दौरान Google से कुंजियां फ़ेच नहीं की जा सकतीं, तो हमारे प्रोडक्शन यूआरएल से keys.json फ़ेच करें. इसके बाद, उसे अपने सिस्टम में सेव करें और समय-समय पर मैन्युअल तरीके से रीफ़्रेश करें. सामान्य परिस्थितियों में, Google, ECv2 के लिए नई रूट साइनिंग कुंजी जारी करता है. यह कुंजी, सबसे लंबी समयसीमा वाली कुंजी के खत्म होने से पांच साल पहले जारी की जाती है. कुंजी के साथ छेड़छाड़ होने पर, Google सभी कारोबारियों या कंपनियों को सूचना देता है. इसके लिए, वह सेल्फ़-सर्विस पोर्टल में दी गई संपर्क जानकारी का इस्तेमाल करता है. ऐसा इसलिए किया जाता है, ताकि keys.json को फिर से लोड करने का अनुरोध जल्दी किया जा सके. यह पक्का करने के लिए कि आप नियमित तौर पर होने वाले रोटेशन से न चूकें, हमारा सुझाव है कि जो कारोबारी या कंपनियां, Google की कुंजियों को keys.json के कॉन्टेंट में सेव करना चाहती हैं वे हर साल होने वाले अपने की रोटेशन के तहत, हर साल कुंजियों को रीफ़्रेश करें.

सार्वजनिक यूआरएल से मिली कुंजियों को इस फ़ॉर्मैट में मैप किया जाता है:

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

keyValue, कुंजी का base64 वर्शन है. इसे रैप या पैड नहीं किया गया है. इसे X.509 स्टैंडर्ड में बताए गए ASN.1 टाइप SubjectPublicKeyInfo में कोड किया गया है. Java में, ASN.1 एन्कोडिंग को X509EncodedKeySpec क्लास से दिखाया जाता है. इसे ECPublicKey.getEncoded() से हासिल किया जा सकता है.

टेस्ट और प्रोडक्शन एनवायरमेंट, दोनों के यूआरएल इन लिंक पर दिए गए हैं:

डेटा सुरक्षित करने वाली कुंजी का नया वर्शन बनाना

अगर आपने सीधे इंटिग्रेशन की मदद से, अपने सर्वर पर पेमेंट के तरीके के टोकन को डिक्रिप्ट किया है, तो आपको हर साल कुंजियों को रोटेट करना होगा.

एन्क्रिप्शन कुंजियों को रोटेट करने के लिए, यह तरीका अपनाएं:

  1. OpenSSL का इस्तेमाल करके, कुंजी का नया जोड़ा जनरेट करें.
  2. Google Pay और Wallet Console खोलें. इसके लिए, उस Google खाते का इस्तेमाल, पहले Google Play पर आपके ऐप्लिकेशन को मैनेज करने के लिए किया जाता था.
  3. Google Pay API टैब में, डायरेक्ट इंटिग्रेशन पैनल में जाकर, अपने मौजूदा सार्वजनिक पासकोड के बगल में मौजूद, मैनेज करें पर क्लिक करें. कोई दूसरी कुंजी जोड़ें पर क्लिक करें.
  4. सार्वजनिक एन्क्रिप्शन कुंजी टेक्स्ट इनपुट फ़ील्ड को चुनें. इसके बाद, जनरेट की गई नई सार्वजनिक कुंजी को अनकंप्रेस्ड पॉइंट फ़ॉर्मैट में base64-कोड में जोड़ें.
  5. एन्क्रिप्शन कुंजियां सेव करें पर क्लिक करें.
  6. कुंजी को रोटेट करने की प्रोसेस को आसान बनाने के लिए, कुंजी को बदलते समय नई और पुरानी, दोनों निजी कुंजियों को डिक्रिप्ट करने की सुविधा चालू रखें.

    अगर टोकन को डिक्रिप्ट करने के लिए Tink लाइब्रेरी का इस्तेमाल किया जाता है, तो एक से ज़्यादा निजी पासकोड के साथ काम करने के लिए, इस Java कोड का इस्तेमाल करें:

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

    पक्का करें कि डिक्रिप्शन के लिए कोड, प्रोडक्शन में डिप्लॉय किया गया हो. साथ ही, यह भी पक्का करें कि आपने सफल डिक्रिप्शन को मॉनिटर किया हो.

  7. अपने कोड में इस्तेमाल किए गए सार्वजनिक पासकोड को बदलें.

    PaymentMethodTokenizationSpecification parameters प्रॉपर्टी में, publicKey एट्रिब्यूट की वैल्यू बदलें:

    /**
     * @param publicKey public key retrieved from your server
     */
    private static JSONObject getTokenizationSpecification(String publicKey) {
      JSONObject tokenizationSpecification = new JSONObject();
      tokenizationSpecification.put("type", "DIRECT");
      tokenizationSpecification.put(
        "parameters",
        new JSONObject()
            .put("protocolVersion", "ECv2")
            .put("publicKey", publicKey));
      return tokenizationSpecification;
    }
  8. चौथे चरण में मिले कोड को प्रोडक्शन में डिप्लॉय करें. कोड डिप्लॉय होने के बाद, एन्क्रिप्ट और डिक्रिप्ट करने के लेन-देन के लिए, कुंजी के नए जोड़े इस्तेमाल किए जाते हैं.
  9. पुष्टि करें कि पुराने सार्वजनिक पासकोड का इस्तेमाल, अब किसी भी लेन-देन को एन्क्रिप्ट करने के लिए नहीं किया जा रहा है.

  10. पुराने निजी पासकोड को हटाएं.
  11. Google Pay और Wallet Console खोलें. इसके लिए, उस Google खाते से साइन इन करें जिसका इस्तेमाल आपने पहले Google Pay के साथ डेवलपर के तौर पर साइन अप करने के लिए किया था.
  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] को से बदलें.

    • चालू है
    • सीधे तौर पर इंटिग्रेशन की सुविधा चालू हो
    • एन्क्रिप्शन कुंजी कॉन्फ़िगर की गई हो

    [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);

    सामान्य परिस्थितियों में, प्रोडक्शन एनवायरमेंट में मौजूद मौजूदा पासकोड 14/04/2038 तक मान्य है. हालांकि, अगर पासकोड के साथ छेड़छाड़ की जाती है, तो यह मान्य नहीं रहेगा. कुंजी के साथ छेड़छाड़ होने पर, Google सभी कारोबारियों या कंपनियों को सूचना देता है. इसके लिए, वह सेल्फ़-सर्विस पोर्टल में दी गई संपर्क जानकारी का इस्तेमाल करता है. ऐसा इसलिए किया जाता है, ताकि keys.json को फिर से लोड करने का अनुरोध जल्द से जल्द किया जा सके.

    कोड स्निपेट, सुरक्षा से जुड़ी इन जानकारी को मैनेज करता है, ताकि आप पेलोड के इस्तेमाल पर ध्यान दे सकें:

    • Google की साइनिंग कुंजियां फ़ेच की गईं और मेमोरी में कैश मेमोरी के तौर पर सेव की गईं
    • हस्ताक्षर की पुष्टि करना
    • डिक्रिप्शन