機密性のあるパスワードマネージャーを作成した

お久しぶりです。

neat02です。今回はシェルスクリプトにてパスワードマネージャーを作ってみました。

前回はブラックジャックゲームの作成手順の記述のみだったので、今回は作成中に生じた疑問点や改善点を主に執筆していけたらという風に思います。

概要

必要な機能は、

①. パスワードの追加

②. パスワードの検索

の2つがあれば最低限のものはできます。

さらに今回は機密性が高いということで、作成したパスワード(ファイルで保存)を暗号化して、検索の際には閲覧可能にしました。

③パスワードの機密性

以上3つを基に作成します。

①パスワードの追加

#Add Passwordの場合     
"Add Password")
     read -p "サービス名を入力してください: " service_name
     read -p "ユーザー名を入力してください: " user_name
     read -p "パスワードを入力してください: " password
         echo ""

         # ディレクトリにパスワードを保存
         file_name="${data_directory}/${service_name}_${user_name}.txt"
     echo "サービス名: $service_name" > $file_name
     echo "ユーザー名: $user_name" >> $file_name
     echo "パスワード: $password" >> $file_name
     
         # 暗号化したファイルの生成
     echo $password | gpg -c --batch --yes --passphrase "$cipher_key" -o  "${file_name}.gpg" $file_name 
         # 暗号化前のファイル削除         
     rm $file_name

     echo "パスワードの追加は成功いたしました。"
          ;;

サービス名、ユーザー名、パスワードを入力してもらい、
サービス名、ユーザー名、パスワードが記載されたファイルを "password_data"にします。 この際、ファイルを暗号化するコマンドが長くなってしまったため、更なる学習が必要だと感じました。

②パスワードの検索

    # Get Passwordの場合
     "Get Password")
         read -p "サービス名を入力してください: " service_name
         # 入力されたサービス名に一致するファイルパターンを用意 
         file_pattern="${data_directory}/${service_name}_*.txt.gpg"  
         # 一致ファイルが存在するかどうか確認
     file_serch=$(find "$data_directory" -name "${service_name}_*.txt.gpg" 2> /dev/null)
         # 一致するファイルが存在しない場合
         if [ ! -e $file_pattern ]; then
        echo "そのサービスは登録されていません"
     # 一致するファイルが存在する場合
     else
             for cipher_file in $file_pattern; do
               decipher_file="${cipher_file%.gpg}" 
               gpg --quiet  --batch --yes --passphrase "$cipher_key" -o "$decipher_file" -d "$cipher_file"            
           cat "$decipher_file" 
           rm  "$decipher_file"
         done          
     fi 
     ;;

サービス名を入力し、入力されたサービス名のファイルを用意する変数"file_pattern"とそれと一致するファイルを検索する変数"file_serch"を作成しました。 一致するファイルが存在する場合、そのファイルは暗号化されているため、復号しなければ内容が見れません。 そこで、暗号化されたファイルの変数、"cipher_file"と復号化されたファイルの変数"decipher_file"を用意します。 file_pattern に一致するファイルのリストをループ処理します。
ループの内容は、変数”decipher_file"で暗号化されたファイルから、復号化したファイルを生成し、 次のコードでGPGを使って暗号化されたファイルを復号化します。
そしてcat , rm で一次的に保存された復号化ファイルの内容を表示し、削除します。
ここでは暗号化と復号化のファイル(変数)を2つ用意することで、ファイルを復号化して内容を見ることができても、暗号化のファイルはそのまま残るため、機密性があります。

まとめ

  • GPGのコマンドが良く分かっていない。
  • 変数=処理にするコードの記述方法は果たしていいのか
  • 暗号化と復号化のファイルを2つ用意することで、機密性を付与することが出来た。