スクリプトから生パスワードを追い出す - Python Advent Calendar 2013

2013/12/02 00:00

※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】

DevOpsですね!CIですね!botですね!

Python Advent Calendar 2013 の2日目です。

スクリプトにパスワードを書きたくないときのお話。

鍵でノーパスワードログインできるなら良いですが、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_____'

暗号化する文字列長に制限があるので、うまいこと考えないといけない。

現実的には?

サーバで使う場合には、Pitとpycryptoを組み合わせると幸せかもしれませんね。結局見えるんですが。

OS側の機能が使えるマシンの場合にはkeyring便利です。

明日は?

パーフェクトPython を一緒に書いた しょーま さんです!

Prev Entry

Next Entry