password generate
Password Managerのソフトウェアは、その会社を信用する必要がある
- 有料であることが多い
- 独自UIを覚えるのが大変
- 理解していないものを使う不安
sha512
+ 秘密鍵
+ web domain
でパスワードを生成
- 再現性がある(秘密鍵さえ一致していれば復元可能である)
- 長いパスワードを生成できるのでロバスト
- 仕組みを簡単に理解できる
コード
".ssh/secret_key"
等は、自分の秘密鍵に書き換える
from hashlib import sha512
import fire
from urllib.parse import urlparse
from pathlib import Path
import re
home = Path.home()
credential_path = Path(home / ".ssh/secret_key")
with credential_path.open("r") as f:
chunks = list(map(lambda x:x.strip(), f.readlines()))
chunks = list(filter(lambda x: not re.search("^-----[BEGIN|END]", x) and x != "", chunks))
secret_key = "".join(chunks)
chrs = list("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()")
def to_chr(i: int) -> str:
return chrs[i%len(chrs)]
def main(url="https://google.com"):
"""
Parameters:
url(str): fullpath of url
Returns:
None
"""
o = urlparse(url)
salt = o.netloc
public_key = sha512(bytes(secret_key + salt, "utf8")).digest()
public_key = "".join([to_chr(c) for c in public_key])
print(f"salt = {salt}")
print(f"public_key = {public_key}")
print(f"public_key of top 10 = {public_key[:10]}")
if __name__ == "__main__":
fire.Fire(main)
使い方(pixivのサイトを例)
password.py
と上記のコードを保存した場合(本物の値を*
でマスクしています)
$ python3 password.py --url=https://www.pixiv.net/
salt = www.pixiv.net
public_key = x%iuhPSUvCzLcEVjKaBDu#*******************!K@lGBuVgqrJOIf%o
public_key of top 10 = x%iuhPSUvC