Это хорошая идея, чтобы сохранить пароль с помощью widget.setPreferenceForKey?

Я пишу виджет Dashboard для Mac OS X для Pastebin.com, и он хранит пароль пользователя (мой код не шифрует его), используя widget.setPreferenceForKey,

Насколько это безопасно и полезно?

2 ответа

Я знаю, что это старый вопрос, но сейчас я пытаюсь разработать виджет Dashboard и столкнулся с тем же вопросом. Я поделюсь тем, что я узнал.

Прежде всего, хорошая новость в том, что вам не обязательно нужен плагин; все, что вам нужно, это дать вашему виджету доступ к командной строке.

OS X на самом деле включает в себя утилиту командной строки под названием security, который позволяет вам делать все виды вещей, связанных с брелок. Вы можете прочитать об этом, введя info security в Терминале. Я еще не достиг точки, где я могу проверить это из самого виджета (только в терминале), но из того, что я почерпнул, я думаю, это то, что вы делаете. Любой, кто знает лучше, пожалуйста, не стесняйтесь вносить изменения.

Хранение пароля в связке ключей

Если предположить, username а также password переменные, которые мы уже настроили:

widget.system("/usr/bin/security add-generic-password -a \""+username+"\" -s \"My Awesome Widget\" -w \""+password+"\" -T \"/usr/bin/security\" -U);

Распределение команд

/usr/bin/security: widget.system() Метод требует полного пути к команде, которую мы выполняем. Эта конкретная команда находится в / usr / bin.

add-generic-password: один из securityмного команд. Существуют другие виды элементов паролей, которые можно добавить в связку ключей, например, интернет-пароли, но я думаю, что универсальный тип лучше всего подходит для этого случая.

-a: "имя учетной записи" или имя пользователя, которое соответствует паролю, который мы хотим сохранить. Цепочка для ключей, вероятно, не будет основным местом, где вы храните имя пользователя, так как нам нужно, чтобы он посмотрел пароль позже, но если у пользователя открыто несколько экземпляров нашего виджета, каждый со своей комбинацией user / pass, включая имя пользователя здесь мы будем специально искать этот пароль, когда придет время. Кавычки не являются строго необходимыми, но вы должны включать их, если имена пользователей для вашего виджета могут содержать пробелы.

-s: "имя службы" для создаваемого нами элемента цепочки для ключей - иными словами, подробное, понятное человеку имя. Имя вашего виджета, вероятно, будет наиболее подходящим здесь.

-w: пароль. Опять же, кавычки рекомендуется, если ваши пароли могут содержать пробелы.

-T: путь (и) к любому приложению (ям), которому разрешен доступ к этому элементу цепочки для ключей без вопросов. Без этого флага любая попытка восстановить пароль позже приведет к тому, что пользователь увидит, что один из тех, "кто хочет использовать вашу секретную информацию, хранящуюся в" Моем удивительном виджете "в вашей цепочке для ключей", будет один из тех, кто ищет безопасность, и, скорее всего, они не будут знать, что это значит, и это пугает их. Я предполагаю, что, потому что виджет использует security запросить пароль, security (а не, скажем, DashboardClient) - это программа, которой необходимо предоставить доступ.

-U: рассказывает security обновить этот элемент цепочки для ключей, если он уже существует, вместо того, чтобы просто потерпеть неудачу.

Получение пароля обратно из брелка

Это включает в себя дополнительный шаг после получения пароля, но он не должен быть слишком плохим.

var messyPassword = widget.system("/usr/bin/security 2>&1 >/dev/null find-generic-password -ga \""+username+"\" -s \"My Awesome Widget\"").outputString;
scrubPassword(messyPassword);

Распределение команд

/usr/bin/security: еще раз привет, офицер. У нас какая-то погода, а?

2>&1 >/dev/null: вывод find-generic-password включает в себя пачки дерьма, в противном случае потенциально полезную информацию, которая нам не нужна в этом случае. К счастью, он выводит пароль отдельно от всего этого, поэтому его можно перехватить самостоятельно, используя этот дополнительный бит. (Спасибо Аллану Одгаарду из Macromates Ltd. за его сообщение в блоге, подробно описывающее этот трюк.)

find-generic-password: аналог add-generic-password, Следующие аргументы используются в качестве критериев поиска.

-g: рассказывает security на самом деле, вы знаете, вывести пароль. В противном случае, я думаю, это просто... признает тот факт, что элемент существует, а затем выходит?

-a: имя пользователя, которое идет с паролем, который мы хотим получить.

-s: удобочитаемое имя, которое мы выбрали для виджета, когда писали add-generic-password команда.

Подожди, что scrubPassword()?

Ну, подвох в том, что даже после того, как все остальное убрано из security ответ, строка, которую вы получите не просто пароль. Это больше похоже на:

password: "nobodywilleverguessthis"

Насколько я знаю, мы должны использовать регулярные выражения, чтобы взломать эту строку и получить блестящую, парольную жемчужину внутри. Я не знаю как вы, но регулярные выражения - это для меня кошмар, поэтому я очень обрадовался, обнаружив txt2re, онлайн-инструмент, который позволяет вам перепроектировать регулярное выражение из строки, которой вы хотите манипулировать. Вы можете буквально просто вставить security вывод в txt2re и захватить кусок JavaScript, который извлечет из него пароль.

Замечания: widget.system() также позволяет использовать функцию-обработчик в качестве второго аргумента, поэтому возможно, что вы могли бы вызвать scrubPassword() функционировать прямо там и пропустить всю часть с messyPassword переменная. Как я уже сказал, я только попробовал позвонить security до Терминала, так что у меня нет опыта работы с widget.system(),

Удаление пароля из брелка

Когда экземпляр виджета закрыт, мы, вероятно, не хотим, чтобы связанный пароль загромождал цепочку для ключей пользователя, поэтому мы ответим на все вопросы и подберем мусор. Эта команда немного проще, чем две другие команды, поскольку нам не нужно ничего создавать или получать что-либо в ответ.

widget.system("/usr/bin/security delete-generic-password -a \""+username+"\" -s \"My Awesome Widget\"");

Распределение команд

/usr/bin/security: обычный.

delete-generic-password: делает то, что написано на коробке, используя следующие аргументы в качестве критериев поиска (или, скорее, поиска и уничтожения).

-a: имя пользователя, соответствующее паролю, который вы хотите удалить.

-s: читаемое имя виджета.

Надеюсь это поможет!

Нет. Пароль будет храниться в незашифрованном виде в списке свойств. Насколько я знаю, не существует прямого способа надежно хранить информацию из виджета. Единственное, о чем я могу подумать, это использовать плагин для хранения пароля в цепочке для ключей пользователя. Посмотрите Интерфейс Плагина Виджета и Справочник по Связке ключей.

Другие вопросы по тегам