2011/07/13

1password から KeePassX への変換

パスワード管理ソフト使ってる?
使ってないなら、是非使った方がいいよ。
ということでパスワード管理ソフトの話。

パスワード管理ソフトは 1password を愛用してます。
Windowsソフト、各ブラウザ対応の拡張機能、iPhoneアプリ、Dropbox による連携と、必要な機能が揃っています。さすがは有料ソフト。
ただし、ひとつだけ弱点が。

Ubuntuソフトが無い。

メインマシンを Ubuntu にしてしまおうと企んでいる今、Ubuntuソフトが無いのは痛い。
一応 1password anywhere という機能を使えば、情報を見れることは見れるんだけど、
ブラウザ拡張機能の便利さを知ってしまった今ではかったるくてやってらんない。

そこで出てくるのが KeePassX。
deb パッケージも用意されていて、Ubuntu Tweak を導入しているなら数ステップでインストールが完了。
ブラウザ拡張機能は無いけれども、Ctrl-U, Ctrl-V でパスワードオートフィルまでやってくれるので、そんなに不便とは思わない。
もちろん Dropbox による連携もOK。
しかし、こっちにはこっちの弱点が。

iPhoneアプリがしょぼい。

まとめるとこんな感じ。

1passwordKeePass
Windowsソフト◎($40)○ KeePass(.kdb)
○ KeePass Pro(.kdbx)
Ubuntuソフト× 1password anywhere◎ KeePassX
Macソフト◎ ($40)◎ KeePassX
iPhoneアプリ◎ 1password($13)
◎ 1password pro($15)
△ MyKeePass($1)
△ iKeePass($1)
ソフトDropbox連携
アプリDropbox連携×
ブラウザ拡張機能×

メインとしてはやはり 1password を使いたい(お金払っちゃったしね!)
Keepass 系も KeePassX は良いんだけど、KeePass Pro が 2系とかいってファイルフォーマットが変わっているのが気に食わないし、iPhoneアプリに Dropbox 連携が無いのはやはりつらい。

じゃあ Ubuntu ではどうするのか。1password anywhere で泣く泣く我慢するのか。

1password のデータを KeePassX 形式に変換して食わせればよい。

ということで、作ってみました。
検証した環境は 1password for Windows(ver. 1.0.6.202)と、KeePassX for Ubuntu(ver. 0.4.3) です。
  1. 1password で File→Export...→Format:Comma Delimited Text, All Logins をチェックしてOK
  2. できたtxtファイル(例:1pass.txt)を Ubuntu に渡す
  3. 下のスクリプトを食わせる(例:1pass2keepass.rb 1pass.txt > keepass.xml)
  4. できたxmlファイルをKeePassXで読み込む(ファイル→インポート→KeePassX XML)
  5. 幸せ
1pass2keepass.rb
#!/usr/bin/ruby -Ku
require "rexml/document"
include REXML
require "csv"
if ARGV.size != 1
        print "Usage: 1pass2keepass.rb [1password.csv] > [output.xml]\n"
        exit 1
end
source = ARGV[0]
doc = REXML::Document.new()
database = doc.add_element("database")
group = database.add_element("group")
group.add_element("title").text = "Logins"
group.add_element("icon").text = "1"
 
csv_data = CSV.open(source, 'rb')
header = csv_data.shift.map { |i| i.to_s }
data = csv_data.map { |row| row.map { |cell| cell.to_s} }
hashes = data.map { |row| Hash[*header.zip(row).flatten] }
 
hashes.each { |row|
        entry = group.add_element("entry")
        entry.add_element("username").text = row["username"]
        entry.add_element("password").text = row["password"]
        entry.add_element("title").text = row["title"]
        entry.add_element("url").text = row["url"]
        entry.add_element("comment").text = row["notes"]
        entry.add_element("icon").text = "1"
}
puts doc

参考にしたのはここのページ。

この方法だと 1password の "Logins" だけしか KeePassX に移行できないけど、
開発者が「ゆくゆくは全部の項目を CSV 形式でエクスポートしたいけど、今すぐじゃないよね」とか言ってるので、あっさりと諦める。
まぁ、Logins 以外が見たかったら 1password anywhere でいいしね。

あと、KeePassX で追加した Logins を 1password にもってくるにはどうしよう、
それならいっそ 1password と KeePassX の同期!
とか考えなくもないけど、とりあえずそれはまたの機会にしよう。

1 件のコメント: