iT邦幫忙

1

用雜湊避免註冊不同網站密碼重複可行嗎

  • 分享至 

  • xImage

有時候在網路上註冊會員
但密碼太多又不好管理
所以想到如果我只記一個高強度密碼
然後每個網站的密碼用下列這方法產生
會不會有什麼問題?

  1. password = toBase64(hmac_sha256(salt=原始密碼, data=網站名稱+日期))
  2. 這邊 hmac_sha256 是舉例,可以用其他類似的雜湊方法
  3. 長度太長的話可以截斷
  4. 網站名稱+日期 可以記錄,不怕給人看

補個大概的程式碼:https://jsfiddle.net/y6o28c34/

html

<label for="pwd-main">主密碼</label>
<input id="pwd-main" type="password" placeholder="主密碼">
<table>
    <thead>
        <tr>
            <th>網站</th>
            <th>長度</th>
            <th>添加</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                <input type="text" id="site-id">
            </td>
            <td>
                <input type="number" id="pwd-len" value="16">
            </td>
            <td>
                <input type="text" id="pwd-pad">
            </td>
            <td>
                <button id="copy-btn" onclick="copyPassword(-1)">複製</button>
            </td>
        </tr>
    </tbody>
    <tbody id="site-list"></tbody>
</table>

javascript

// config 的內容可以記在紙上或印出來,不怕別人看
const config = [
    {
        data: 'it邦幫忙@2022-05-03',
        len: 16,
        pad: ''
    },
    {
        data: '要特殊字元的某站@1977-01-01',
        len: 12,
        pad: '@#$^'
    }
];

document.querySelector('#site-list').innerHTML = config.map((cfg, idx) => {
    //其實 len 跟 pad 可以不用顯示
    return `
    <tr>
        <td>${cfg.data}</td>
        <td>${cfg.len}</td>
        <td>${cfg.pad}</td>
        <td><button onclick="copyPassword(${idx})">複製</button></td>
    </tr>`;
}).join('');

async function copyPassword(idx) {
    let salt = document.querySelector('#pwd-main').value;
    if(salt==='') {
        alert('主密碼不能為空');
        return;
    }
    if(idx >= 0) {
        var { data, len, pad } = config[idx];
    } else {
        var data = document.querySelector('#site-id').value;
        var len = document.querySelector('#pwd-len').value;
        var pad = document.querySelector('#pwd-pad').value;
    }
    let hashVal = await getHmacSha512(salt, data);
    let result = hashVal.slice(0, len) + pad;
    navigator.clipboard.writeText(result);

    //這邊是測試才把 result 顯示出來
    alert(`已複製:${result}`);
}

async function getHmacSha512(salt, data) {
    let coder = new TextEncoder();
    data = coder.encode(data);
    salt = coder.encode(salt);
    let key=await crypto.subtle.importKey('raw', salt, {
        name: 'HMAC',
        hash: 'SHA-512'
    }, false, ['sign', 'verify']);
    let buf = await crypto.subtle.sign('HMAC', key, data);
    let u8arr = new Uint8Array(buf);
    let s = String.fromCharCode.apply(null, u8arr);
    return btoa(s);
}
看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2022-05-30 08:24:10 檢舉
重點是毫無規則的8~12碼不會很好記。
我個人是建議用中文輸入法拆碼的方式。
淺水員 iT邦大師 6 級 ‧ 2022-05-30 11:06:08 檢舉
應該會搭配軟體使用,所以要記的就是
1. 原始密碼
2. 各網站的辨識字串,這個可以明文寫在筆記本應該沒關係
deh iT邦研究生 1 級 ‧ 2022-05-31 08:04:31 檢舉
一律建議keepass
淺水員 iT邦大師 6 級 ‧ 2022-05-31 11:14:45 檢舉
與隨機亂數必須保存在電子設備相比
使用雜湊的話可以把資訊保存在紙本上(網站名稱、日期、長度那些)
只要算法固定,就算電腦壞了也不怕
我遇過一個機車的網站,他打密碼不是全部打出來,而是亂數取出 6-8 碼,他可能跟你講請輸入密碼第 37268152 的字元,下次變成 93176511,然後密碼不能使用生日跟名字的任何一個字,例如我1/1生,然後網站1/1號註冊,我要照樓主的規則弄日期上去,這樣鐵定不行,很G8的規則
淺水員 iT邦大師 6 級 ‧ 2022-06-01 12:36:03 檢舉
這個也太擾民
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
黃彥儒
iT邦高手 1 級 ‧ 2022-05-30 00:12:18

會,因為總是有一些網站有莫名其妙的密碼規則,然後Base64產出來的不符合那G8的規則
例如特殊符號只允許-@.之類的,然後還規定你一定要包含特殊符號

淺水員 iT邦大師 6 級 ‧ 2022-05-30 11:07:57 檢舉

我想到需要特殊符號就添加在最後
剛剛在問題後面有補個範例

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-05-30 08:58:11

這真是個好點子

如果想得完整一點就可以寫成程式賣錢了
(其實好像一定得寫成程式才能用,總不能每次登入都拿紙筆在那裡 sha256/base64 吧)

我只想得到兩個問題
1.密碼規則:大小寫英文,允許/不允許符號字元,長度
2.長度太長的話可以截斷:既然用 hash 就有機會要處理 collusion,截斷長度會增加 collusion 的機率,要事先想好處理 collusion 的規則。除非你不在乎「在不同網站使用相同密碼」。

淺水員 iT邦大師 6 級 ‧ 2022-05-30 11:10:38 檢舉

密碼規則感覺滿多種的,還要細部處理一下
大概的程式我有補上
不過禁用特殊字元(+/)還沒處理

密碼規則感覺滿多種的

其實只有「一種」
就是 Regular Expression/images/emoticon/emoticon06.gif

淺水員 iT邦大師 6 級 ‧ 2022-05-30 11:36:26 檢舉

不同站的規則可能不一樣吧?
其實滿想用base85的

2
一級屠豬士
iT邦大師 1 級 ‧ 2022-05-30 22:44:22

搭配傳統的一些詩詞,比較好記.例如:
https://ithelp.ithome.com.tw/upload/images/20220530/20050647K747xTYTEw.png

看更多先前的回應...收起先前的回應...

對仗工整,意境深遠
/images/emoticon/emoticon12.gif/images/emoticon/emoticon12.gif/images/emoticon/emoticon12.gif

淺水員 iT邦大師 6 級 ‧ 2022-05-31 11:03:40 檢舉
  1. 這應該要紀錄哪個字對應到哪個網站
  2. 如果單純雜湊,身邊有人看時就曝光了,才另外需要輸入時其他人看不到的東西作為 salt
  3. 中文輸入的部分我之前有想過,一樣是避免身邊有人時的狀況。不是說不能用,但是輸入只有自己知道的那段 salt,感覺用非中文輸入時會比較安全。

這個拿來當salt 也可以.

淺水員 iT邦大師 6 級 ‧ 2022-06-01 12:38:31 檢舉

詩詞當 salt 應該不錯
也可以考慮在英數模式當作平常用的輸入法,在鍵盤上打這個詩詞

1

國外的密碼管理政策都漸漸導向密碼複雜度重要性優於更換密碼的頻率,只是要注意密碼長度的限制XD 如果SHA256太長,SHA128 + salting應該強度也很夠惹吧!

另外記憶長密碼也是不符合人體工學,還是期待無密碼時代吧!

我要發表回答

立即登入回答