Contents
便利なパスワード管理ソフト
ここではクリップボードの履歴をとるアプリを作成しましたが、履歴をとりたくないものもあるはずです。
突然ですがパスワードの管理はどうしていますか? まさか同じパスワードを使い回ししていないでしょうね。これではひとつバレると全部バレてしまいます。なので、パスワードはサイトごとに変えましょう。
そこで便利なのがパスワード管理ソフトです。私はKeePassを使っているのですが、これだとマスターキーだけ覚えておけば他のパスワードを覚える必要はありません。画面に表示されることなくクリップボードに転送されるのでログインするときも簡単です。
しかし、こんなものが履歴に残っては大変なことになります。パソコンのスクリーン・ショットを記録して情報を盗むマルウエアもあります。大事なパスワードが盗まれてしまいます。
パスワードを登録させない
そこで登録したくないものを登録できないように改良することにします。パスワードと思われるものは登録できないようにします。
半角英数のみならパスワードの可能性がある文字列として履歴の対象から外します。文字コードを調べてすべてが0x7f以下の場合、その文字列は半角アルファベット、半角数字、記号であることになります。パスワードの可能性があるということです。この場合はメッセージボックスで本当に登録するのかを尋ねます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public partial class Form1 : Form {     void OnClipboardUpdate()     {         if (ignoreClipbordChange)            return;         if (Clipboard.ContainsText())         {             string str = Clipboard.GetText();             if (IsPassWord(str))             {                 if(MessageBox.Show(                     "この文字列はパスワードの疑いがあります。それでも登録しますか?", "確認",                         MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2)                 == DialogResult.No)                 {                     return;                 }             }             vs.Insert(0, str);             string itemText = str.Replace("\n", "\\n");             itemText = itemText.Replace("\t", "\\t");             itemText = itemText.Replace(" ", "");             itemText = itemText.Replace(" ", "");             listBox1.Items.Insert(0, itemText);         }     }     bool IsPassWord(string str)     {         char[] vs = str.ToArray();         if (vs.Any(x => x > 0x7f))             return false;         return true;     } } | 
他の部分は前回と同じです。
それから登録された文字列を削除するなどの機能も追加してみました。
他にも機能を追加してみる
登録された文字列を削除
| 1 2 3 4 5 6 7 8 9 | private void deleteToolStripMenuItem_Click(object sender, EventArgs e) {     int i = listBox1.SelectedIndex;     if (i != -1)     {         listBox1.Items.RemoveAt(i);         vs.RemoveAt(i);     } } | 
登録された文字列をすべて削除
| 1 2 3 4 5 | private void allClearToolStripMenuItem_Click(object sender, EventArgs e) {     listBox1.Items.Clear();     vs.Clear(); } | 
ファイルに保存
| 1 2 3 4 5 6 7 8 9 10 11 12 | private void SaveFileToolStripMenuItem_Click(object sender, EventArgs e) {     XmlSerializer xml = new XmlSerializer(typeof(List<string>));     SaveFileDialog dialog = new SaveFileDialog();     dialog.Filter = "データファイル|*.dat";     if (dialog.ShowDialog() != DialogResult.OK)         return;     StreamWriter sw = new StreamWriter(dialog.FileName);     xml.Serialize(sw, vs);     sw.Close(); } | 
ファイルから読み出し
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private void LoadFileToolStripMenuItem_Click(object sender, EventArgs e) {     XmlSerializer xml = new XmlSerializer(typeof(List<string>));     OpenFileDialog dialog = new OpenFileDialog();     dialog.Filter = "データファイル|*.dat";     if (dialog.ShowDialog() != DialogResult.OK)         return;     StreamReader sr = new StreamReader(dialog.FileName);     vs = (List<string>)xml.Deserialize(sr);     sr.Close();     listBox1.Items.Clear();     foreach (string str in vs)     {         string itemText = str.Replace("\n", "\\n");         itemText = itemText.Replace("\t", "\\t");         itemText = itemText.Replace(" ", "");         itemText = itemText.Replace(" ", "");         listBox1.Items.Add(itemText);     } } | 
普段はタスクトレイのなかにいれておくとか
クリップボードの監視はやめてよく使うものだけファイルに保存してそれを使うという使い方もありだと思います。
