有時候在網路上註冊會員
但密碼太多又不好管理
所以想到如果我只記一個高強度密碼
然後每個網站的密碼用下列這方法產生
會不會有什麼問題?
password = toBase64(hmac_sha256(salt=原始密碼, data=網站名稱+日期))
網站名稱+日期
可以記錄,不怕給人看補個大概的程式碼: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);
}
會,因為總是有一些網站有莫名其妙的密碼規則,然後Base64產出來的不符合那G8的規則
例如特殊符號只允許-@.
之類的,然後還規定你一定要包含特殊符號
這真是個好點子
如果想得完整一點就可以寫成程式賣錢了
(其實好像一定得寫成程式才能用,總不能每次登入都拿紙筆在那裡 sha256/base64 吧)
我只想得到兩個問題
1.密碼規則:大小寫英文,允許/不允許符號字元,長度
2.長度太長的話可以截斷:既然用 hash 就有機會要處理 collusion,截斷長度會增加 collusion 的機率,要事先想好處理 collusion 的規則。除非你不在乎「在不同網站使用相同密碼」。
搭配傳統的一些詩詞,比較好記.例如:
國外的密碼管理政策都漸漸導向密碼複雜度重要性優於更換密碼的頻率,只是要注意密碼長度的限制XD 如果SHA256太長,SHA128 + salting應該強度也很夠惹吧!
另外記憶長密碼也是不符合人體工學,還是期待無密碼時代吧!