Elisp: संवेदनशील जानकारी को init फ़ाइल से बाहर कैसे करें? (यानी लॉगिन क्रेडेंशियल)


11

मैं अपनी init स्क्रिप्ट में एक लॉग इन फ़ंक्शन को परिभाषित करना चाहता हूं, लेकिन मैं अपने लॉगिन क्रेडेंशियल्स को हार्डकोड नहीं करना चाहता हूं। मुझे लगता है कि एक स्थानीय फ़ाइल से मेरे लॉगिन क्रेडेंशियल्स में मेरी इनइट स्क्रिप्ट पढ़ने के लिए एक अच्छा समाधान है, और इन मानों को चर के रूप में सहेजें। इस तरह, मैं फ़ाइल को अपने git इंडेक्स से बाहर कर सकता हूं, जो मेरे लॉगिन क्रेडेंशियल्स को सुरक्षित रखता है।

क्या इस दृष्टिकोण पर कोई सुझाव है, या एक फ़ाइल में परिभाषित मूल्य के लिए एक तर्क सेट करने के तरीके हैं?

उदाहरण के लिए, मैं निम्नलिखित का उपयोग करना चाहूंगा init.el:

;; Set up our login variables here:
(setq file-location "~/.emacs.d/.login")
(setq erc-username "default-name")
(setq erc-password "default-password")
(setq erc-url "default-url")
(setq erc-port "default-port")
(defun read-lines (filePath)
  "Return a list of lines of a file at filePath."
  (with-temp-buffer
    (insert-file-contents filePath)
    (split-string (buffer-string) "\n" t)))
(if (file-exists-p file-location)
    (progn (setq login-credentials (read-lines file-location))
           (setq erc-username (nth 0 login-credentials))
           (setq erc-password (nth 1 login-credentials))
           (setq erc-url (nth 2 login-credentials))
           (setq erc-port (nth 3 login-credentials)))
    (message "No ERC login credentials provided. Please add login credentials as '<username>\n<password>\n<url>\n<port>' in ~/.emacs.d/.login to activate ERC mode."))

;; These message the values from my file correctly.
;; Everything up to this point works as expected
(message erc-username) 
(message erc-password)
(message erc-url)
(message erc-port)

;; Use our login variables here 
;; This doesn't work because the 'quote' function prevents evaluation of my variables, and a 'backquote' did not resolve it either
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(markdown-command "/usr/bin/pandoc")
 '(tls-program (quote ("openssl s_client -connect %h:%p -no_ssl2 -ign_eof -CAfile ~/.ssl/spi_ca.pem -cert ~/.ssl/znc.pem")))
 '(znc-servers (quote ((,erc-url ,erc-port t ((irc\.freenode\.net ,erc-username ,erc-password)))))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

ध्यान दें कि मेरा उदाहरण यहांznc.el मॉड्यूल का उपयोग करता है । मैं autacenerated कोड को संशोधित कर रहा हूँ जिसके परिणामस्वरूप Emacs कॉन्फ़िगर होता है M-x customize-group RET znc RETऔर M-x customize-variable RET tls-program RET

उपरोक्त कोड के साथ मेरा मुद्दा यह है कि चर मेरे custom-set-variablesफ़ंक्शन के अंदर लोड नहीं कर रहे हैं । फ़ाइल से उचित मान लोड करना ठीक काम करने लगता है, लेकिन मैं उनका उपयोग तर्क के रूप में नहीं कर सकता। मेरा मानना ​​है कि यह quoteफ़ंक्शन से संबंधित है , जो इसकी सामग्री के मूल्यांकन को रोकता है। मैंने ,मूल्यांकन को बाध्य करने के लिए एक 'बैककॉट' ( ) का प्रयास किया , लेकिन यह भी काम नहीं कर रहा है। इस बग को ठीक करने या किसी अन्य दृष्टिकोण की पेशकश करने के लिए कोई सुझाव बहुत मददगार होगा।

जवाबों:


11

Emacs के साथ आता है auth-source.el। मैं इसके अपने संस्करण को रोल करने की कोशिश नहीं करूंगा।

auth-sourceइससे पढ़ने में आसानी होती है ~/.authinfo.gpg। अच्छे कार्यक्रम पहले से ही समर्थन करेंगे authinfo। एक त्वरित खोज बताती है कि ईआरसी का उपयोग कर सकते हैंauthinfo

शेल्फ MELPA कार्यक्रमों से अपने यादृच्छिक के लिए आप आसानी से ~/.authinfo.gpgइस तरह से अपने पासवर्ड को पुनः प्राप्त करने के लिए Cortinfo का उपयोग कर सकते हैं

(with-eval-after-load 'random-mode
  (require 'auth-source)
  (let ((auth (nth 0 (auth-source-search :host "secrets.com"
                                         :requires '(user secret)))))
    (setq random-psk (funcall (plist-get auth :secret))
          random-user (plist-get auth :user))))

~/.authinfo.gpgनिम्नलिखित पंक्ति कहां है :

## Used by random-mode.el
machine secrets.com login rasmus password my-secret-password

बेशक सुरक्षा की भावना एक झूठ है। अब आपका पासवर्ड एक चर में प्लेनटेक्स्ट में संग्रहीत है:

random-psk => "my-secret-password"

लेकिन कम से कम यह कुछ git-repo या dropbox में नहीं है!

यदि आपको किसी प्रकार की कीरिंग मिली है तो आप सीक्रेट सर्विस एपीआई (देखें (info "(auth) Secret Service API")) का उपयोग करके वहां से क्रेडेंशियल्स प्राप्त करने में सक्षम हो सकते हैं ।


6

custom-set-variablesअजीब है - मैं 100% निश्चित नहीं हूं कि यह इस तरह के मामलों को संभाल सकता है। आप कोशिश कर सकते हैं (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), लेकिन यह मुझे एक गंदे हैक के रूप में हमला करता है।

gpgएक्सटेंशन के साथ एक फ़ाइल में अतिरिक्त जानकारी डालें, इसे सहेजें, एक पासवर्ड दें, और फिर फ़ाइल को लोड करें। जब आप इसे लोड करेंगे तो आपको फ़ाइल के लिए पासवर्ड डालना होगा।

उदाहरण के लिए, sensitive.el.gpgसामग्री के साथ एक फ़ाइल बनाएँ :

(message "Hello, there!")

फ़ाइल को सहेजें, दबाएं (या टैब ओवर) [OK], और अपना पासवर्ड दें। चिंता न करें - इसे बचाने से पहले पुष्टि के लिए कहेंगे। फिर, अपनी init फ़ाइल में, दें

(load "sensitive.el.gpg")

यह फ़ाइल को स्टार्टअप पर लोड करेगा, आपको अपना पासवर्ड दर्ज करने की आवश्यकता होगी ताकि Emacs फ़ाइल को डिक्रिप्ट कर सकें।

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

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.