注意
サンプルアプリは誰でも使用してかまいませんが、データの安全性は一切保証しません。
悪用されようが私は一切責任を負いません。
自分でサーバーを立てて使用することを推奨します。
頭の大きなロボット
星新一のお話に、「頭の大きなロボット」というものがあります。指紋認証に全ての認証を託していた主人公が、指を失って困ってしまうお話です。
現代のパスワードマネージャや、物理デバイス認証は最強だと思います。しかし不運な事故が重なってそれらがリセットされたらどうしようもないんじゃないでしょうか。
こんなhtmlを作ってみました
ランダム生成やデバイス認証をせず、ユーザー脳内の複数の覚えやすい情報から、複雑で強力なパスワードを生成するhtmlを作りました。
このプログラムを使わなくても、同じ文字列、同じ処理を同じ手順で実行すればパスワードを再現できるようにしています。
おためし: https://utasimaru.github.io/my_hashword/
公開ソース: https://github.com/utasimaru/my_hashword
サービス毎に違う強力なパスワードを複数の要素から生成します。
SHA-256(弱パスワード+サービス名+更新回数)
async function GENERATE_HASHWORD62(
password,
service,
version_count,
prefix,
pass_length,
) {
const seed = password + service + version_count;
const encoder = new TextEncoder();
const data = encoder.encode(seed);
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const bytes = new Uint8Array(hashBuffer);
// 符号付きバイト配列を符号なし(0-255)の数値配列に変換
const unsignedBytes = bytes.map((b) => b + 127);
let hash = bytesToBase62s(unsignedBytes, pass_length);
// 2. hashの先頭をprefixで置き換え
// hashの「prefixの長さ以降」の部分と「prefix」を結合します
// hashが0123456で、prefixがaaaの場合:
// hash.substring(3) は 3456 となるため、aaa + 3456 = aaa3456 となります
return prefix + hash.substring(prefix.length);
}
function bytesToBase62s(bytes, length) {
const chars =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
let result = "";
for (let i = 0; i < length; i++) {
let _byte = bytes[i % bytes.length];
result += chars[_byte % 62];
}
return result;
}
弱パスワード
頭の中にある、覚えやすいパスワードです。
☆サーバーにはアップロードされません。
サービス名
これを弱パスワードに連結して、サービス毎に違うパスワードを生成します。
「google」と「Google」で出力は変わってしまいます。
☆あまり重要ではないので、サーバーにアップロードできます。
更新回数
パスワードが漏洩した時など、変更が必要な時に数字を増やします。
「定期的にパスワードを変更してください(←ふざけんな)」にも対応可能!
☆あまり重要ではないので、サーバーにアップロードできます。
先頭語
生成したパスワードはBase62(大文字、小文字、数字)によって構成されています。パスワードが大文字小文字数字全てを含む必要があるような場合、または記号を含めなければいけない場合など、生成するパスワードが絶対に条件を満たすよう、先頭にある文字を先頭語に置き換える処理があります。
☆あまり重要ではないので、サーバーにアップロードできます。
サーバーについて
同じパスワードを生成するのに、「グーグル」なのか「google」なのか「Google」なのか正確に覚えるのは面倒なので、弱パスワード以外をサーバーにアップロードできます。
ログイン情報を得るためにログインするというのも変な話なので、このサンプルでは、ログインなしでニックネームを鍵としてデータをアップロードします。ただし、そのニックネームを使用すれば誰でもデータを取得/更新できるというセキュリティ皆無のサーバーです。
自分が何のサービスのパスワードを管理しているか等を知られたくない人は絶対に使わないでください。