• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

password generate

date: 2020-12-07 excerpt: password generate

tag: password generate


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


password generate Share Tweet