tips-jp

小ネタ集 (Tips written in Japanese)


Project maintained by KazKobara Hosted on GitHub Pages — Theme by mattgraham

コマンド引数直書きパスワードへの対処方法 – pdftk, qpdf を例として –

コマンドラインやCUI (Character User Interface)でコマンドを実行する際のパスワード入力方法には、以下のような方法がある。

  1. パスワード入力プロンプトが表示されそこに入力する
  2. コマンド引数に直書き

2.を実行する場合、コマンド実行履歴などにパスワードが残る場合があるため、後に端末に侵入されたり、端末が盗まれたりした場合のことを考慮すると、適切に処理しておいた方がよい。なお、コマンド実行時に既に端末が乗っ取られてしまっている場合には、別の追加の対策も必要となる。

対応策1: 履歴から削除

Linux の場合

history

コマンドで左側に番号、右側に実行されたコマンドが表示されるため、削除したいコマンド履歴の番号を調べ、以下のコマンドで削除。

history -d <番号>

他の箇所にもコマンド実行履歴が残っている場合には、それら毎の対応が必要。

対応策2: コマンド引数直書き以外の方法が存在していないか調べる

pdftkコマンドの場合

引数のパスワードを記述する箇所に PROMPT と記述する。 (動作は pdftk port to java 3.0.9で確認)

pdftk input.pdf output encrypted.pdf user_pw PROMPT

すると、パスワードを入力するためのプロンプトが表示され、打ち込んだパスワードは表示される(表示させない方法は以下を参照)。

Please enter the user password to use on the output PDF.
   It can be empty, or have a maximum of 32 characters:
<ここに password を打ち込む> 

パスワード入力プロンプトに打ち込んだパスワードを表示させない方法

stty -echo && command_with_password_prompt; stty echo

対応策3: パスワード入力プロンプトに文字を打ち込む度に * (アスタリスク)を表示させる

前準備

  1. password_prompter.sh を入手:

     curl -O https://raw.githubusercontent.com/KazKobara/tips-jp/gh-pages/linux/password_prompter.sh
    
  2. 中身を確認(意図しない挙動が含まれていないかなど)

     cat ./password_prompter.sh
    
  3. permission を以下のようにしておく。

     chmod 400 ./password_prompter.sh
    

password_prompter.sh の使い方

上記の $pw および以下の $upw 変数は、コマンドの最後でそれぞれ unset pw upw を実行することでも自動的に消去可能であるが、処理が途中で中断されると最後まで実行されず変数が残ってしまう。そのため、コマンド行は必ず () で囲んでから(つまりsubsystem上で)実行すること。

PDFファイルを暗号化する場合の例

pdftkコマンドの場合:

(source ./password_prompter.sh && {echo; pdftk input.pdf output encrypted.pdf user_pw "$pw";})

qpdfコマンドの場合:

(source ./password_prompter.sh && {echo; qpdf --encrypt "$pw" "" 128 --use-aes=y -- input.pdf encrypted.pdf;})

PDFファイルをユーザパスワードで暗号化し、オーナーパスワードもセットする場合の例

qpdfコマンドの場合:

(source ./password_prompter.sh "user " && {upw="$pw"; read_password "owner ";} && qpdf --encrypt "$upw" "$pw" 128 --use-aes=y -- input.pdf encrypted.pdf)

pdftkコマンドの場合:

(source ./password_prompter.sh "user " && {upw="$pw"; read_password "owner ";} && pdftk input.pdf output encrypted.pdf user_pw "$upw" ower_pw "$pw")

暗号化されたPDFファイルを復号する場合の例

qpdfコマンドの場合:

(source ./password_prompter.sh && qpdf --password="$pw" --decrypt encrypted.pdf decrypted.pdf)

pdftkコマンドの場合:

(source ./password_prompter.sh && pdftk encrypted.pdf input_pw "$pw" output decrypted.pdf)

おまけ

文字を打ち込む度に * (アスタリスク)を表示させなくても良い場合には、それぞれ以下のように置き換えてもよい。ただし、パスワードとして受け付ける文字は制限されないため、Web経由などの別システムから入力を受け付ける場合には、別途入力文字への sanitization を行う必要がある。


homeに戻る