mongodb - सीएल-मॉंगो में मोंगोडीबी एसएएसएल प्रमाणीकरण को कार्यान्वित करना



cryptography common-lisp (0)

मैंने क्लोन-मॉंगो (सामान्य लिप मोंगो डीबी लाइब्रेरी) को फ़ॉन्स से तब्दील कर दिया है, क्योंकि यह रखरखाव से बाहर हो चुका है और SCRAM-SHA-1 लॉगिन प्रक्रिया का समर्थन नहीं करता है यह मेरा काम है: https://github.com/mprelude/cl-mongo- मुख्य परिवर्तन सीएल-स्क्रैम पर निर्भरता जोड़ रहा है (मेरे SCRAM का कार्यान्वयन), और एक बीएसओन बाइनरी जेनेरिक कंटेनर जोड़ना

मैं अभी भी प्रारंभिक संदेश भेजने का प्रयास कर रहा हूं, इसलिए समस्या यह नहीं है कि पासवर्ड गलत है, क्योंकि इसका अभी तक उपयोग नहीं किया गया है

प्रमाणीकरण का यह हिस्सा असफल क्यों है? क्या कोई यह पुष्टि कर सकता है कि क्या मुझे संदेश भेजना चाहिए, यदि मुझे संदेश भेजने के लिए क्या करना है, तो क्या मुझे भेजना चाहिए?

यह मेरा जोड़ा है, कुछ अतिरिक्त डिबग आउटपुट के साथ:

* (asdf:load-system :cl-mongo)

T
* (cl-mongo:db.use "test")

"test"
* (cl-mongo:db.auth "aurumrw" "pencil" :mechanism :SCRAM-SHA-1)

(kv-container : #(#S(CL-MONGO::PAIR :KEY saslStart :VALUE 1)
                  #S(CL-MONGO::PAIR :KEY mechanism :VALUE SCRAM-SHA-1)
                  #S(CL-MONGO::PAIR
                     :KEY payload
                     :VALUE [CL-MONGO::BSON-BINARY-GENERIC]  [binary data of type 0] ))
 ((CL-MONGO::BINARY-MESSAGE
   . #(98 105 119 115 98 106 49 104 100 88 74 49 98 88 74 51 76 72 73 57 83 87
       116 122 101 84 100 78 101 71 100 97 90 71 52 53 85 69 86 113 87 108 104
       85 89 108 78 75 89 106 74 80 79 87 78 84 99 49 108 84 82 68 99 61))
  (CL-MONGO::MESSAGE . "n,,n=aurumrw,r=Iksy7MxgZdn9PEjZXTbSJb2O9cSsYSD7")
  (CL-MONGO::CODE . 18) (CL-MONGO::OK . 0.0d0)
  (CL-MONGO::ERRMSG . "Authentication failed.")))

विशेष रूप से, मुझे लगता है कि मोंगो को मेरे अनुरोध को सही तरीके से पढ़ना होगा क्योंकि संदेश 'प्रमाणीकरण विफल' (त्रुटि कोड 18) है, जो बताता है कि यह समझता है कि मैंने एक एसएएसएल बातचीत का अनुरोध किया है।

मेरा मानना ​​है कि जिन मुद्दों पर मैं रहा हूं वे पेलोड पर आधारित हैं, या तो सामग्री (base64'd प्रारंभिक संदेश, ओकटसेट के रूप में) या प्रारूप।

मोंगोडीबी प्रलेखन पर आरेखण और जिस तरह से मूल चर्चा काम करती है, यह मेरा पुनः लिखित db.auth फ़ंक्शन है:

(defmethod db.auth ((username string) (password string) &key (mongo (mongo)) (mechanism :SCRAM-SHA-1))
  (cond ((equal mechanism :SCRAM-SHA-1)
          ;; SCRAM-SHA-1 Login
          (let* ((nonce (cl-scram:gen-client-nonce))
                 (pwd (concatenate 'string username ":mongo:" password))
                 (md5-pwd (hex-md5 pwd))
                 (md5-pwd-str (ironclad:byte-array-to-hex-string md5-pwd))
                 (initial-message (cl-scram:gen-client-initial-message :username username
                                                                       :nonce nonce))
                 (request (kv (kv "saslStart" 1)
                              (kv "mechanism" "SCRAM-SHA-1")
                              (kv "payload"
                                  (bson-binary :generic (ironclad:ascii-string-to-byte-array
                                                          (cl-scram:base64-encode initial-message))))))
                 (response (car (docs (db.find "$cmd" request :limit 1 :mongo mongo))))
                 (retval (pairlis '(errmsg ok code message binary-message)
                                   (list (get-element "errmsg" response)
                                         (get-element "ok" response)
                                         (get-element "code" response)
                                         initial-message
                                         (ironclad:ascii-string-to-byte-array (cl-scram:base64-encode initial-message))))))
            (list request retval)))
        ((equal mechanism :MONGODB-CR)
          ;; MONGODB-CR Login.
          (let* ((nonce (get-element "nonce" (car (docs (db.run-command 'getnonce :mongo mongo)))))
                 (pwd (concatenate 'string username ":mongo:" password))
                 (md5-pwd (hex-md5 pwd))
                 (md5-pwd-str (ironclad:byte-array-to-hex-string md5-pwd))
                 (md5-key (hex-md5 (concatenate 'string nonce username md5-pwd-str)))
                 (md5-key-str (ironclad:byte-array-to-hex-string md5-key))
                 (request (kv (kv "authenticate" 1)
                              (kv "user" username)
                              (kv "nonce" nonce)
                              (kv "key" md5-key-str)))
                 (retval (get-element "ok" (car (docs (db.find "$cmd" request :limit 1 :mongo mongo))))))
            (if retval t nil)))
        (t nil)))




sasl-scram