JSON फ़ाइल में मुझे एन्क्रिप्टेड मानों को उनके स्पष्ट टेक्स्ट मानों के साथ कमांड लाइन टूल jq का उपयोग करके प्रारंभिक प्रक्रिया के रूप में बदलने की आवश्यकता है। एक एप्लिकेशन तब स्पष्ट टेक्स्ट मानों को अधिलेखित करते हुए, अपनी कुंजियों के साथ मानों को फिर से एन्क्रिप्ट करेगा। एन्क्रिप्ट किए गए मानों को "$ क्रिप्टो" ऑब्जेक्ट के रूप में दर्शाया जाता है, जिसमें एन्क्रिप्शन विधि के बारे में जानकारी होती है और किन कुंजियों का उपयोग किया जाता है, जो इस तरह दिखता है:

{
    "$crypto" : {
        "type" : "x-simple-encryption",
        "value" : {
            "cipher" : "AES/CBC/PKCS5Padding",
            "stableId" : "someId",
            "salt" : "4J5ckE6+JaS8TLqAN4073g==",
            "data" : "vBeHAPJXLl+X/8Enp9vxMA==",
            "keySize" : 16,
            "purpose" : "someDescription",
            "iv" : "N2xCe5RiJibHv9hLY+OduA==",
            "mac" : "VoOo1BKptwfqIJeSOb/qGA=="
        }
    }
}

ये "$ क्रिप्टो" ऑब्जेक्ट JSON संरचना में कहीं भी हो सकते हैं। एक नमूना इनपुट दस्तावेज़ इस तरह दिखता है:

{
    "unknownKey1" : {
        "unknownKey2" : {
            "name" : "JWT_SESSION",
            "properties" : {
                "maxTokenLifeMinutes" : 120,
                "tokenIdleTimeMinutes" : 30
            }
        },
        "unknownKey3" : [
            {
                "unknownKey4" : "STATIC_USER",
                "unknownKey5" : {
                    "unknownKey6" : "internal/user",
                    "unknownKey7" : "anonymous",
                    "unknownKey8" : {
                        "$crypto" : {
                            "type" : "x-simple-encryption",
                            "value" : {
                                "cipher" : "AES/CBC/PKCS5Padding",
                                "stableId" : "someId",
                                "salt" : "4J5ckE6+JaS8TLqAN4073g==",
                                "data" : "vBeHAPJXLl+X/8Enp9vxMA==",
                                "keySize" : 16,
                                "purpose" : "someDescription",
                                "iv" : "N2xCe5RiJibHv9hLY+OduA==",
                                "mac" : "VoOo1BKptwfqIJeSOb/qGA=="
                            }
                        }
                    }
                },
                "enabled" : true
            }
        ]
    }
}

तो "अज्ञातके 8" का मान एन्क्रिप्ट किया गया था। मुझे इस तरह दिखने के लिए उस दस्तावेज़ की आवश्यकता है:

{
    "unknownKey1" : {
        "unknownKey2" : {
            "name" : "JWT_SESSION",
            "properties" : {
                "maxTokenLifeMinutes" : 120,
                "tokenIdleTimeMinutes" : 30
            }
        },
        "unknownKey3" : [
            {
                "unknownKey4" : "STATIC_USER",
                "unknownKey5" : {
                    "unknownKey6" : "internal/user",
                    "unknownKey7" : "anonymous",
                    "unknownKey8" : "clearTextValue"
                },
                "enabled" : true
            }
        ]
    }
}

मैं निम्न आदेश का उपयोग कर इनपुट फ़ाइल में क्रिप्टो ऑब्जेक्ट्स ढूंढने में सक्षम हूं:

cat input.json | jq 'paths | select(.[-1] == "$crypto")'
[
  "unknownKey1",
  "unknownKey3",
  0,
  "unknownKey5",
  "unknownKey8",
  "$crypto"
]

लेकिन मैं प्रतिस्थापन करने पर सार्थक प्रगति नहीं कर पाया हूं।

1
Volker Scheuber 25 जिंदा 2020, 23:49

2 जवाब

सबसे बढ़िया उत्तर

निम्नलिखित पाठ में वर्णित प्रतिस्थापन करता है। की तर्ज पर एक आह्वान

jq --arg cleartext "clearTextValue" -f decrypt.jq sample.json

माना गया है। यदि आपके jq में walk/1 नहीं है, तो या तो jq 1.6 में अपग्रेड करें या इसके आह्वान से पहले इसका def शामिल करें (Google खोज शब्द: jq def walk builtin.jq)।

# input is assumed to be an object
def decrypt($value):
  with_entries(if .value|type == "object"
    then with_entries(if .value | (type == "object" and has("$crypto"))
      then .value = $value else . end)
    else . end) ;

walk(if type == "object" then decrypt($cleartext) else . end)
0
peak 26 जिंदा 2020, 06:24
पवित्र गाय, @peak, क्या अच्छा उपाय है! मुझे मान्य होने में थोड़ा समय लगा, क्योंकि मेरा jq संस्करण 1.5 था, जिसमें "चलना" विधि नहीं थी, लेकिन 1.6 के उन्नयन ने इसे ठीक कर दिया। समय निकालने के लिए आपका बहुत-बहुत धन्यवाद! मैं
 – 
Volker Scheuber
26 जिंदा 2020, 05:22

स्वीकृत उत्तर के अतिरिक्त और यदि jq v1.5 का उपयोग कर रहे हैं, तो इसे decrypt.jq के रूप में उपयोग करें

# input is assumed to be an object
def decrypt($value):
  with_entries(if .value|type == "object"
    then with_entries(if .value | (type == "object" and has("$crypto"))
      then .value = $value else . end)
    else . end) ;

# walk was added after the release of jq@1.5
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

walk(if type == "object" then decrypt($cleartext) else . end)
0
peak 26 जिंदा 2020, 06:20