0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

パスワード生成・管理サイトを作ったので紹介します(IndexedDB+バックアップ前提)

Last updated at Posted at 2025-11-28

ブラウザだけで完結する、シンプルなパスワード生成・管理ツールを作りました。
自分用の実験ツールだったのですが、せっかくなので Qiita でも紹介しておきます。

・公開版はこちら
https://uni928.github.io/TestYou/index34.html

・HTML コードはこちら(単一 HTML ファイル)
https://github.com/uni928/TestYou/blob/main/index34.html

ブラウザ上で完結し、外部サーバーへの送信はありません。
IndexedDB にリアルタイム保存されるので、ブラウザを閉じても同じ状態から再開できます。
また、HTML ファイルをローカルに保存して開いてもそのまま動作します。

是非、HTML ファイルをローカルに保存し、コードに不審な処理(情報の抜き取りなど)が含まれていないか、ChatGPT などで確認した上でご利用ください。


このツールでやりたかったこと

・ブラウザだけで動くパスワード生成・簡易管理ツールが欲しい
・インストール不要、アカウント登録不要
・見た目はそこそこきれいにして、毎日触ってもストレスが少ない UI
・パスワードはある程度ルールを揃えたい(共通プレフィックス+ランダム)
・万が一に備えてバックアップも取りたい

一般的なパスワードマネージャーほど高機能ではありませんが、
「ある程度割り切って、自分の用途にぴったり寄せたツールを作る」
というコンセプトで作っています。


サイトの URL と動作環境

・サイト本体
https://uni928.github.io/TestYou/index34.html

・コード(単一 HTML)
https://github.com/uni928/TestYou/blob/main/index34.html

どちらも特別なサーバーサイド処理は使っておらず、純粋な HTML + CSS + JavaScript だけで構成されています。
そのため、GitHub 上の index34.html をローカルに保存して、ブラウザで直接開くだけでも動作します。

例)

  1. 上記 GitHub リンクを開く
  2. 「Raw」などから HTML を保存
  3. 保存した index34.html をダブルクリックしてブラウザで開く

このように「ローカルに落としても動作する」という構成にしているので、
ネットワークにつながらない環境でも、ある程度は自己完結できます。

是非、HTML ファイルをローカルに保存し、コードに不審な処理(情報の抜き取りなど)が含まれていないか、ChatGPT などで確認した上でご利用ください。


どんなパスワードが生成されるか

このサイトでは、パスワードは次のルールで生成されます。

・先頭は必ず
Uni928_
・その後ろに、
小文字英字 / 大文字英字 / 数字
からランダムに 25 文字
・結果的に、
Uni928_XXXXXXXXXXXX...(合計 32 文字)
のような形式になります

ランダム部分の生成には、ブラウザの Crypto API(crypto.getRandomValues)を使っています。
完全に安全を保証するものではありませんが、Math.random だけを使うよりはマシな方向に寄せています。


画面構成と機能

左側:パスワード一覧

左側のカードでは、登録したパスワードの一覧を管理します。

1 エントリにつき、次の項目があります。

・タイトル
サービス名や用途などを自由に入力できます
例)ChatGPT、Google、ネットバンキング など

・URL
ログイン画面などの URL をメモしておけます

・自動生成パスワード
Uni928_ + ランダム 25 文字で生成されたパスワード
横の「コピー」ボタンでクリップボードにコピーできます

・コピー / 削除 / 並べ替えボタン
・コピーボタン:パスワード文字列をコピー
・削除ボタン:その行を削除(確認ダイアログあり)
・▲ ▼ ボタン:エントリの順序を上下に入れ替え

新しくパスワードを生成すると、リストの一番上に追加されるようにしています。
よく使うサービスの順に並べておくと、普段の運用が少し楽になります。


IndexedDB へのリアルタイム保存

このツールでは、入力した内容はすべてブラウザの IndexedDB に保存されます。
具体的には、次のようなタイミングで保存処理が走ります。

・タイトルを編集したとき
・URL を編集したとき
・新しいパスワードを生成したとき
・エントリを削除したとき
・▲ ▼ で並べ替えたとき

短い遅延(数百ミリ秒)を挟んで、連続操作でも無駄に書き込みが増えないように調整しています。
画面下部には、

・保存中…
・すべて保存済み
・保存エラー

などのステータス表示と、小さなインジケータが表示されます。

ブラウザを閉じた後、再度 https://uni928.github.io/TestYou/index34.html を開くと、
IndexedDB から状態を読み込み、前回の続きから再開します。

なお、この挙動はローカルに保存した index34.html を開いた場合も同様です。
同じブラウザ・同じファイルパスで開けば、過去の状態が復元されます。


エクスポート / インポート機能(バックアップ)

このツールの重要な前提として、

「登録の度にエクスポートしてバックアップを取っておく」

ことを強く推奨しています。

エクスポート

右側のカードには、バックアップ用の UI を用意しています。

・エクスポートボタン
押すと、現在の状態を JSON 形式でダウンロードします。
ファイル名は
uni928_backup_YYYYMMDD_HHMMSS.json
のような形式になります。

・JSON をコピーボタン
JSON 全体をテキストとしてクリップボードにコピーします。
テキストエリアにも同じ内容が表示されるので、メモアプリなどに保存しておくこともできます。

エクスポートされた JSON には、実際のパスワード情報に加えて、

「新しいパスワードを登録するたびにエクスポートして、安全な場所にバックアップしておくことをおすすめします。」

といった注意メッセージも含めています。

登録のたびにエクスポートを推奨している理由

あくまでブラウザ内(IndexedDB)に保存しているだけなので、

・ブラウザのキャッシュ・サイトデータを削除した
・シークレットウィンドウで使っていた
・ブラウザを再インストールした
・プロファイルを作り直した
・別の端末や別ブラウザからアクセスした

といったタイミングで、保存されていたデータが消えてしまう可能性があります。

そのため、本ツールでは「登録の度にエクスポート」を前提に設計しています。
新しくパスワードを追加したり、変更したりしたタイミングで、エクスポートして JSON をどこかに保管しておく運用を強くおすすめします。

インポート

バックアップしておいた JSON から、状態を復元することもできます。

・ファイルからインポート
以前ダウンロードした JSON ファイルを選択すると、現在のリストがバックアップ内容で上書きされます。

・テキストエリアからインポート
テキストエリアに JSON を貼り付け、「下のエリアからインポート」ボタンを押すと、同様に復元されます。

インポート時には「現在のリストは上書きされます」といった確認ダイアログを出しているので、
間違えて上書きしないように注意しつつ使ってください。


保存形式の例

会社のサーバー上にテキストファイルとして保存する場合は、下記のような内容が一例として考えられます。

https://uni928.github.io/TestYou/index34.html

{
  "version": 1,
  "exportedBy": "Uni928_ パスワード生成マネージャー",
  "note": "このバックアップは Uni928_ パスワード生成サイトからエクスポートされたデータです。新しいパスワードを登録するたびにエクスポートして、安全な場所にバックアップしておくことを強くおすすめします。",
  "exportedAt": "2025-11-28T03:09:14.825Z",
  "items": [
    {
      "id": "id_miia5l5d_i7akq7",
      "title": "aaa",
      "url": "bbb",
      "password": "Uni928_9EMmGrGhvbP97Nk35h59DQegF",
      "createdAt": "2025-11-28T03:05:40.178Z"
    },
    {
      "id": "id_mii9mmql_1zv5nv",
      "title": "ccc",
      "url": "ddd",
      "password": "Uni928_6haK7fmRXZs52Ajfu68Fdw3Vt",
      "createdAt": "2025-11-28T02:50:55.773Z"
    }
  ]
}

保存形式については、用途に応じて各自工夫していただければ幸いです。

バックアップ JSON は、外部ストレージ・メモ帳アプリ・クラウドメモなど、
「ブラウザキャッシュに依存しない場所」に保管しておくと安心です。


ローカルに保存して使う場合

先ほど触れたとおり、このツールは単一の HTML ファイルで完結しています。

から index34.html を保存し、ローカルで開けば、GitHub Pages 版とほぼ同じように動作します。

・メリット
・ネットワークがオフラインでも使える
・自分の好きなディレクトリ構成で管理できる
・(必要であれば)自分でコードを編集してカスタマイズ可能

・注意点
・保存場所や開き方が変わると、IndexedDB 上は別のサイトとして扱われる場合があります
・つまり、同じファイルでも「別のパスにコピーしたもの」を開くと、空の状態として扱われることがあります
・そのため、ローカルで使う場合も、やはり「登録の度にエクスポートしておく」運用が重要です


技術的な実装メモ(ざっくり)

技術的には、次のような要素を組み合わせています。

・HTML + CSS だけでそれなりに見た目にこだわったカード UI
・JavaScript での状態管理(配列 items)
・IndexedDB を使ったシリアライズ(状態をまとめて 1 レコードに保存)
・保存のデバウンス処理(短時間の連続操作で無駄な書き込みを抑える)
・Crypto API によるランダム文字列生成
・クリップボード API(navigator.clipboard)によるコピー処理
・フォールバックとして document.execCommand("copy") も一応対応
・JSON エクスポート/インポート処理

シンプルな構成なので、パスワード部分を別の形式に変更したり、項目を増やしたりするのも比較的簡単です。


免責・クレームについて

最後に、とても重要な点です。

このツールは、個人が趣味で作成したものです。
できるだけ気をつけて実装していますが、

・本ツールを利用したことによる損害
・データ消失やバックアップの失敗
・第三者によるパスワードの不正利用

などに対して、作者は一切の責任を負いかねます。

特に、ブラウザの IndexedDB 上のデータは、

・ブラウザのキャッシュ削除
・ブラウザや OS の再インストール
・ブラウザプロファイルの変更
・シークレットウィンドウでの利用

などによって、予告なく消える可能性があります。

そのため、

「登録の度にエクスポートして、安全な場所にバックアップを取る」

という運用を徹底していただくことを大前提としています。
申し訳ありませんが、データが飛んでしまった場合のクレームや問い合わせには対応できません。

あくまで「自己責任で使う簡易ツール」という位置づけでご利用ください。


まとめ

・ブラウザだけで動く、Uni928_ プレフィックス付きパスワード生成ツールを作成
・IndexedDB にリアルタイム保存し、再起動後も状態を復元可能
・タイトル、URL、パスワード、コピー、削除、上下移動でシンプル管理
・JSON エクスポート/インポート対応でバックアップが取れる
・HTML ファイルをローカルに保存しても、そのまま動作する構成
・ただし、データ消失の可能性があるので、登録の度にエクスポートする運用を強く推奨
・データが飛んだ場合のクレームや責任は負えない前提のツール

もし気になった方は、ぜひ

を開いて、ブラウザ上で試してみてください。


📘 関連リンク(再掲)

👉 今まで作ったサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?