Зберігання паролів у Emacs

  • 2012-03-12
  • (автор: yurb)

Ми реєструємось на безлічі інтернетних ресурсів, і бажано на кожному із них використовувати пароль, який ви більше ніде не використовуєте. Тут ми опишемо як можна організувати зручну й незалежну від вебної переглядалки базу з паролями в простому текстовому файлі, зашифрованому через GPG, і зручно користуватись нею в текстовому редакторі GNU Emacs. Для цього треба:

  1. Мати або створити власну пару ключів GPG;
  2. Налаштувати зберігання записів з допомогою функції forms-mode;
  3. Організувати собі функції-помічники, які б дозволили легко здійснювати пошук у базі і додавати до неї записи.

Це ми й спробуємо зробити.

1. Створення ключа

(Якщо у вас уже є власна пара ключів GPG, можете переходити до пункту №2). Мати свою пару ключів GPG зручно: ви можете передати т. зв. публічний ключ кому завгодно, і він зможе зашифрувати для вас дані; але розшифрувати їх зможете лише ви, і лише з допомогою другого, секретного ключа, який треба пильно берегти. Щоб згенерувати власну пару ключів, запустіть

gpg --gen-key

Програма задасть кілька технічних питань (на які можна відповідати просто Enter — типові значення є оптимальними), після чого ви введете ваше ім’я, електронну адресу та пароль до ключа, який має бути достатньо міцним, адже ним може бути захищено дуже багато ваших шифрованих даних. Його слід добре пам’ятати:) І ось, ключ згенеровано.

2. Налаштування Forms-mode.

В Emacs є зручна річ для роботи з тестовими базами даних: forms-mode. Вона дає можливість редагувати таку базу у вигляді анкети, а також здійснювати по ній пошук. Щоб її налаштувати, потрібно створити т. зв. контрольний файл: там буде вказано як відтворювати на екрані записи, і звідки їх брати. Ось приклад:

;; Вказати де лежать записи
(setq forms-file "~/ваш-файл-з-паролями.gpg")

;; Скільки полів у кожному записі
(setq forms-number-of-fields 4)

;; Дозволити редагування
(setq forms-read-only nil)

;; Як виглядатиме бланк
(setq forms-format-list
	  (list
	   "URI: " 1 "\n" ;; адреса в Інтернеті
	   "UID: " 2 "\n" ;; обліковий запис
	   "PWD: " 3 "\n" ;; пароль
	   "COM: " 4 "\n" ;; коментар
	   "\n"))

;; Не зберігати тимчасових версій файлу (щоб не вислизнули паролі)
(auto-save-mode 0)

У другому рядку змініть адресу файлу з паролями на таку, яка вам підходить. Зберігаємо цей файл, наприклад, у ~/elisp/accounts.el. Закриваємо файл через C-x k (буфер потрібно ліквідувати). Forms-mode налаштовано.

3. Пишемо функції для легкого пошуку і додавання

Ось приклад:

(defvar getpw-file
  "Контрольний файл forms-mode для бази даних паролів.")

;; Де лежить файл?
(setq getpw-file "~/elisp/accounts.el")

(defun getpw (match)
  "Пошук записів, що відповідають критерію MATCH у базі паролів."

  (interactive "sШукати у базі паролів: ")
  (let ((targetbuf (file-name-nondirectory getpw-file)))
	(if (> (length match) 0) ; Перевірити чи надано критерій пошуку
		(progn
		  ;; Відкрити файл
		  (if (or (if (get-buffer targetbuf) (switch-to-buffer targetbuf))
				  (forms-find-file getpw-file))
			  ;; Шукати
			  (forms-search-forward match)
			(error "Неможливо відкрити контрольний файл forms-mode")))
	  (error "Критерій пошуку не вказано."))))

(defun addpw ()
  "Додавання запису до бази даних паролів."

  (interactive)
  (let ((targetbuf (file-name-nondirectory getpw-file)))
	(if (or (if (get-buffer targetbuf) (switch-to-buffer targetbuf))
			(forms-find-file getpw-file))
		(forms-insert-record t)
	(error "Не вдалось відкрити контрольний файл forms-mode."))))

Це потрібно додати у ваш файл ~/.emacs i перезавантажити програму.

4. Користуємось

Тепер додамо перший запис. Запускаємо M-x addpw. Відразу відкривається вікно forms-mode з пустим записом. Заповнюємо його, і тиснемо C-x C-s. Тут Emacs запитає нас, яким ключем потрібно зашифрувати файл паролів. Ставимо курсор на наш ключ і тистемо m, тоді [ok]. Файл з паролями створено. Переконайтесь, що право запису до нього є лише у вас. Щоб знайти запис: M-x getpw. Нас запитує критерій пошуку: вводимо, підтверджуємо, і знаходимо наш запис. Якщо потрібно шукати далі, тиснемо C-c C-s.