私は、Pastebin.com 用の Mac OS X ダッシュボード ウィジェットを作成していますwidget.setPreferenceForKey
。
このようにすることは安全で良い方法ですか?
私は、Pastebin.com 用の Mac OS X ダッシュボード ウィジェットを作成していますwidget.setPreferenceForKey
。
このようにすることは安全で良い方法ですか?
これは古い質問であることは承知していますが、現在ダッシュボード ウィジェットを自分で開発しようとしており、同じ質問に直面しました。私が学んだことを共有します。
まず第一に、良いニュースは、必ずしもプラグインが必要というわけではないということです。必要なのは、ウィジェットにコマンド ラインへのアクセスを許可することだけです。
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
の多くのコマンドの 1 つ。インターネット パスワードなど、キーチェーンに追加できるパスワード項目は他にもありますが、この場合は一般的なタイプが最適だと思います。
-a
: 「アカウント名」またはユーザー名。保存したいパスワードと一緒に使用します。キーチェーンは、後でパスワードを検索するために必要になるため、おそらくユーザー名を保存する主要な場所ではありませんが、ユーザーがウィジェットの複数のインスタンスを開いており、それぞれがユーザー名を含む異なるユーザー/パスの組み合わせを持っている場合ここでは、必要なときにそのパスワードを具体的に調べてみましょう。引用符は厳密には必要ありませんが、ウィジェットのユーザー名にスペースを使用できる場合は引用符を含める必要があります。
-s
: 作成しているキーチェーン アイテムの「サービス名」、つまり、冗長で人間が読める名前です。ウィジェットの名前がおそらくここで最も適切でしょう。
-w
: パスワード。繰り返しますが、パスワードにスペースが含まれている可能性がある場合は、引用をお勧めします。
-T
: このキーチェーン項目に問題なくアクセスできるアプリケーションへのパス。このフラグがないと、後でパスワードを取得しようとすると、「セキュリティがキーチェーンの「My Awesome Widget」に保存されている機密情報を使用しようとしています」というプロンプトのいずれかがユーザーに表示され、ユーザーが何を知らない可能性があります。それは意味し、彼らを驚かせるでしょう。ここでは、ウィジェットが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. の Allan Odgaard に感謝します。)
find-generic-password
: の対応物add-generic-password
。続く引数は、検索基準として使用されます。
-g
:security
実際にパスワードを出力するよう指示します。それ以外の場合は、アイテムが存在するという事実を確認してから終了するだけだと思いますか?
-a
: 取得したいパスワードに対応するユーザー名。
-s
add-generic-password
:コマンドを記述したときにウィジェット用に選択した、人間が判読できる名前。
scrubPassword()
?問題は、 の返信から他のすべてのものを取り除いた後でも、security
返される文字列はパスワードだけではないということです。それはもっと似ています:
password: "nobodywilleverguessthis"
私の知る限り、正規表現を使用してその文字列を解読し、その中にある光沢のあるパスワードのような真珠を取得する必要があります。あなたのことはわかりませんが、正規表現は私にとって悪夢のようなものなので、操作したい文字列から正規表現をリバースエンジニアリングできるオンラインツールであるtxt2reを見つけて、とても安心し、興奮しました. 文字通りsecurity
の出力を txt2re に貼り付けて、そこからパスワードを抽出する JavaScript のチャンクを取得できます。
注:
widget.system()
ハンドラー関数を 2 番目の引数として使用することもできるため、関数をその場で呼び出して変数scrubPassword()
の部分全体をスキップするmessyPassword
おっしゃる通り、今のところターミナルからの呼び出ししか試しsecurity
ていないので、実際に使った経験はありませんwidget.system()
。
ウィジェットのインスタンスが閉じられたとき、関連付けられたパスワードがユーザーのキーチェーンを混乱させたままにしたくないので、責任を持ってゴミを拾い上げます。これは、何かを作成したり、応答として何かを取得したりする必要がないため、他の 2 つのコマンドよりも少し単純です。
widget.system("/usr/bin/security delete-generic-password -a \""+username+"\" -s \"My Awesome Widget\"");
/usr/bin/security
: いつもの。
delete-generic-password
: 次の引数を検索 (または、検索と破棄) 基準として使用して、ボックスに記載されていることを実行します。
-a
: 取り出したいパスワードに対応するユーザー名。
-s
: 人間が判読できるウィジェットの名前。
お役に立てれば!
いいえ。パスワードは暗号化されずにプロパティ リストに保存されます。私の知る限り、ウィジェットからの情報を安全に保存する直接的な方法はありません。私が考えることができる唯一のことは、プラグインを使用してパスワードをユーザーのキーチェーンに保存することです。Widget Plugin InterfaceおよびKeychain Services Referenceを参照してください。