スクリプトにパスワードを書きたくないときのお話。
鍵でノーパスワードログインできるなら良いですが、ID/Password渡さないといけない場合もありますよね。
本エントリはOS X 10.9、Python3.3.3rc1で確認しています。
実行時に入力してもらう
書きたくないのであれば、入力してもらえば良いですね。
ビルトイン関数のinputでどうでしょう。
>>> pswd = input('input your passowrd: ') #python2では raw_input でした
input your passowrd: password
おっと、入力してるときに丸見えじゃありませんか。
では、getpassモジュールのgetpass関数を使いましょう。
>>> pswd = getpass('input your password: ')
input your password:
ふむ。
何度も入力したくない
Pitを使ってみましょう。毎回入れてもらうのは自動化できませんからね。
https://pypi.python.org/pypi/pit/
Python3でも https://gist.github.com/tsuyukimakoto/7728056 な感じで動きますね。
利用する前に、EDITOR環境変数に好きなエディタを入れておきましょう。
$ export EDITOR='vi'
必要な情報を得ようとしたときに未設定の場合には、エディタが起動します。保存して終了すると、値が戻ります。
>>> from pit import Pit
>>> Pit.get('spamname',{'require': {'email':'your email','password':'your password'}})
{'email': 'mtsuyuki@gmail.com', 'password': 'passwd'}
プレーンテキストだけど一回入れれば保存されて便利です。消したいときもファイル消すだけですし。 id:Yoshiori がPython3対応してくれないかなー
OSのパスワード保存機構を利用する
OSの機能をラップしてくれます。コマンドラインでも使えます。
https://pypi.python.org/pypi/keyring
>>> import keyring
>>> keyring.set_password('spamservice', 'tsuyukimakoto', 'passwd')
>>> keyring.get_password('spamservice', 'tsuyukimakoto')
'passwd'
OSXの場合には、keychainに保存されます。なんとなく安心ですね。
Ubuntuとかでも動くらしいですが、残念なことにGnomeの機能をラップしているのでサーバインストールだと使えないことが多いようです。
しっかりした風にする
コードを見れば戻せてしまうので、このシチュエーションでは果たして頑張る意味があるのかはなぞですね。
https://pypi.python.org/pypi/pycrypto
Python 1.5.2 is not supported. がウケます。頑張り過ぎでしょう。
秘密のkeyとIVで暗号化して
>>> from Crypto.Cipher import AES
>>> obj = AES.new('16 or 24 or 32 bytes key', AES.MODE_CBC, 'sixteen bytes IV')
>>> obj.encrypt('my password_____')
b'\xe1\xc6\x00^\xce\x0c\xb0\rE[\xdc\xba\xbc\xdb\xd9U'
秘密のkeyとIVで戻す
>>> from Crypto.Cipher import AES
>>> encrypted = b'\xe1\xc6\x00^\xce\x0c\xb0\rE[\xdc\xba\xbc\xdb\xd9U'
>>> obj2 = AES.new('16 or 24 or 32 bytes key', AES.MODE_CBC, 'sixteen bytes IV')
>>> obj2.decrypt(encrypted)
b'my password_____'
暗号化する文字列長に制限があるので、うまいこと考えないといけない。