参考情報
- ID・パスワード管理ツール ID Manager
- [I2K]IDM2KeePass 1.00
- KeePass Password Safe
- KeePassXC
- Keepass2Android Password Safe(Android用アプリ)
- Keepass2Android Offline(Android用アプリ)
- Keepass2Android は Offline 版がオススメ
- KeePassium Password Manager(iPhone/Mac用アプリ)
- パスワード管理ソフトをID ManagerからKeePassに移行する方法
xmlと変換ツールを使う方法 - IDMからKeePassXCへの移行(パスワード管理ツール)
csvで移行する方法
今までWindowsでパスワード管理アプリとして、ID Manager(IDM)を使ってきたのだが、KeePass(KeePassXC)へ移行した。
IDMは使いやすくて便利だったのだが、直接のきっかけは、妻がPCをWindowsからMacに換えたこと(妻の妹に勧められた(そそのかされた)のだが、わからないと大不満状態)。それとは別に、スマホでも見たいなぁというのは前からあった。
なぜKeePass(KeePassXC)を選んだかというと、データはローカルで管理、DBファイルは標準化された形式(.kdbx)とわかりやすい。フリー広告なし(オープンソース)、クラウドドライブで共有可能も理由。いちばんしっくりくる。
パスワード管理ソフトとしては、1Passwordが有名だが、なんとなくクラウドにデータを置くのはいやな感じがする(人間が古いので)。といいつつDropboxを使うのだが…。有料だし。
KeePassとKeePassXCはどちらもオープンソースで、DBファイルは共通に使える。KeePassはWindows用に開発されているが、KeePassXCはそこから派生したもので、Windows/Mac/Linuxで使えるらしい(まちがえていたらごめんなさい)。見た目は、KeePassXCの方が新しい感じで使いやすそう。
DBファイルは標準化された形式なので、対応するアプリを使えば、AndroidやiPhoneでも使える(参考情報5,6参照)
データの移行は、参考情報7に詳しく書かれている。
大まかな流れは、IDMでXMLファイルを書き出し→変換ツール(IDM2KeePass)でXMLファイルを変換→KeePassで読み込むとなる。
だいたいその通りでいいのだが、自分で確認した内容を記載する
- KeePassはXMLファイルを取り込めるが、KeePassXCは取り込めない
- KeePassXCはcsvファイルを取り込める(IDM2KeePassは使わない)が、フォルダ構造が失われる。もしかしたら、IDM2KeePassにcsvもあるので、経由したらいけるのかも
- KeePassXCの方が見やすいので、使うのはKeePassXC
- IDMの1つ目の項(Account ID)の内容は、KeePassXCでユーザー名の内容となる
- IDMの2つ目の項(Password)の内容は、KeePassXCでパスワードの内容となる
- URLはURLに
- 下欄のコメントは、メモに
- 有効期限は失われる(IDM2KeePass.exeが変換していない)
- その他の項目は、詳細設定タブに、属性と値として取り込まれる
(参考情報7には、Item1/Item2/serial number/e-mail/Fileは引き継がれないと書かれているが、引き継がれていた)
- IDMで1つ目と2つ目の項に名前を付けていた場合(契約者番号、ログインPW等)、失われる
- 1つ目がID, 2つ目がPWでない場合(例:契約者番号前半、契約者番号後半等)、
パスワード:契約者番号後半 となり表示がずれた感じになる
2については、数も多くないので、事前にIDM上で手動で修正することにした。
1について、気にしなくてもいいかもしれないが、後で見た時にわけわからなくと困るので、Pythonのスクリプトを作って、IDMからエクスポートしたXMLのメモ欄に追記されるようにした。
1つ目と2つ目がデフォルトの名前(Account ID, Password)でない場合は、コメント欄に下記を追加
account:記載されていた内容(契約者番号等)
password:記載されていた内容(ログインPW等)
空行
Pythonスクリプト
import os
import xml.etree.ElementTree as ET
def process_xml(input_file_path):
# 出力ファイル名の生成(例: data.xml -> data_変換.xml)
dir_name, file_name = os.path.split(input_file_path)
base_name, ext = os.path.splitext(file_name)
output_file_name = f"{base_name}_変換{ext}"
output_file_path = os.path.join(dir_name, output_file_name) if dir_name else output_file_name
# Shift-JISのファイルを一度Python側でテキストとして読み込む
with open(input_file_path, 'r', encoding='shift-jis') as f:
xml_content = f.read()
# 文字列からXMLツリーを構築
root = ET.fromstring(xml_content)
# ルートから デフォルト値 (<defaultAccountName>, <defaultpasswordName>) を取得
e_defaultAccountName = root.find('defaultAccountName')
e_defaultPasswordName = root.find('defaultPasswordName')
t_defaultAccountName = e_defaultAccountName.text if e_defaultAccountName is not None else ""
t_defaultPasswordName = e_defaultPasswordName.text if e_defaultPasswordName is not None else ""
# 任意の階層にあるすべての <item> 要素を再帰的に取得
for item in root.findall('.//item'):
e_account = item.find('account')
e_password = item.find('password')
comment = item.find('comment')
lines_to_add = []
# account の name 属性とデフォルト値を比較
if e_account is not None:
e_account_name = e_account.get('name', '')
if e_account_name != t_defaultAccountName:
# 文字列 "account:" を付与
lines_to_add.append(f"account:{e_account_name}")
# password の name 属性とデフォルト値を比較
if e_password is not None:
e_password_name = e_password.get('name', '')
if e_password_name != t_defaultPasswordName:
# 文字列 "password:" を付与
lines_to_add.append(f"password:{e_password_name}")
# どちらか(または両方)がデフォルトと異なる場合
if lines_to_add:
# 順序: account:xxx, password:xxx, 空行, 既存のコメント
prefix = "\n".join(lines_to_add) + "\n\n" # "\n"を区切りとして、リストを結合する。最後に改行2回で空行追加
if comment is not None:
current_comment = comment.text if comment.text else ""
comment.text = prefix + current_comment
else:
# <comment> タグが存在しない場合は新規作成
new_comment = ET.Element('comment')
new_comment.text = prefix.strip() + "\n" # strip() 文字列前後の空白や改行を除く
item.append(new_comment)
# 変換後のXMLを指定した出力ファイル名で書き出し (encoding='shift-jis')
tree = ET.ElementTree(root)
tree.write(output_file_path, encoding='shift-jis', xml_declaration=True)
print(f"処理が完了しました。出力ファイル: {output_file_path}")
if __name__ == "__main__":
# 処理対象の入力ファイル名を指定(スクリプトに埋め込み)
target_file = "IDM.xml" # 実際のファイル名に変更してください
process_xml(target_file)
- ID manager→ファイル→データのエクスポート→XMLファイルへの書き出し
- 1をこのフォルダへコピー(別でも3でpath指定すれば行けるはずだがためしていない)
- このスクリプトの最後の方の、target_file = "*.xml" をそのファイル名に変更
- VSCodeでターミナルを開く→ Command Prompt
- python .\IDM_KeePass1.py(上記のスクリプトのファイル名) → 元のファイル名_変換.xmlというファイルができる
- IDM2KeePass.exeで変換
- KeePassで、06でできたxmlファイルを読み込み
(MacにはKeePassが無いので、Windowsで行う必要がある)
まず、新規データベースを作ってからインポート - File→New→OK→DBのファイル名指定→マスターパスワード設定
→Database Settingsは何も入力せずにOK→KeePassエマージェンシーシート:skip - File→Import→KeePass XML(2.*)を選択→06でできたXMLファイルを選択→Overwrite if newer(Create New IDsでもいいと思うけど)
- File→Save
- 7でできた *.kdbx をKeePassXCで読み込み
- 実験していたDB等がある場合は削除:データベース→データベースを閉じる
実ファイルも削除(OS上で) - (データベース→)データベースを開く→07でできた*.kdbxを開く
- 上の方にある自動でできたフォルダ(一般等)を右クリック→削除(ゴミ箱に移動)
- 移行で作ったxmlファイル(あれば.csvも)を削除(生のパスワードが書いてあるので)
本当は、ただの削除ではなく、データの上書きをしたいところだけど…
- 出来た*.kdbxファイルをDropboxに置く
- PCのKeePassXCのデータベースをDropboxの物に置き換える
- スマホでアプリをインストール起動し、Dropbox上の*.kdbxを開く
私はAndroidで、KeePass2Android Offline を使った。Offlineにしたのは、Google Playのコメントに進めてあったから。あとで見ると、参考情報7が見つかり、同じような事が書いてあった。
妻はiPhoneなので、KeePassium を使った。ちょっと忘れたが、サーバーを選ぶとDropboxが現れ、そこから *.kdbxを選んだ。
0 件のコメント:
コメントを投稿