CLI for generating password hashes and add unittest for pwhash
This commit is contained in:
parent
203c78b97b
commit
aa6e102b07
@ -29,7 +29,7 @@ def gen_pwhash(password: str) -> str:
|
|||||||
|
|
||||||
class PWInfo:
|
class PWInfo:
|
||||||
|
|
||||||
def __init__(self, salt, sh):
|
def __init__(self, salt: bytes, sh: bytes):
|
||||||
self.salt = salt
|
self.salt = salt
|
||||||
self.scrypt_hash = sh
|
self.scrypt_hash = sh
|
||||||
|
|
||||||
@ -52,3 +52,14 @@ def check_pass(password: str, pwinfo: PWInfo) -> bool:
|
|||||||
n=SCRYPT_N,
|
n=SCRYPT_N,
|
||||||
r=SCRYPT_R,
|
r=SCRYPT_R,
|
||||||
p=SCRYPT_P)
|
p=SCRYPT_P)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
if len(sys.argv) == 2:
|
||||||
|
print(gen_pwhash(sys.argv[1]))
|
||||||
|
elif len(sys.argv) == 3:
|
||||||
|
ok = check_pass(sys.argv[1], parse_hash(sys.argv[2]))
|
||||||
|
print("OK" if ok else "NOT OK")
|
||||||
|
else:
|
||||||
|
print("Usage: python3 -m mail4one.pwhash <password> [password_hash]", file=sys.stderr)
|
||||||
|
@ -1,22 +1,36 @@
|
|||||||
from .pwhash import *
|
from .pwhash import gen_pwhash, parse_hash, check_pass, SALT_LEN
|
||||||
|
import unittest
|
||||||
|
|
||||||
def check_pass_from_hash(password: str, pwhash: str) -> bool:
|
|
||||||
try:
|
class TestPWHash(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_expected_usage(self):
|
||||||
|
password = "Blah Blah ABCD"
|
||||||
|
pwhash = gen_pwhash(password)
|
||||||
pwinfo = parse_hash(pwhash)
|
pwinfo = parse_hash(pwhash)
|
||||||
except:
|
self.assertEqual(len(pwinfo.salt), SALT_LEN)
|
||||||
return False
|
self.assertEqual(len(pwinfo.scrypt_hash), 64)
|
||||||
return check_pass(password, pwinfo)
|
self.assertTrue(check_pass(password, pwinfo),
|
||||||
|
"check pass with correct password")
|
||||||
|
self.assertFalse(check_pass("foobar", pwinfo),
|
||||||
|
"check pass with wrong password")
|
||||||
|
|
||||||
test_hash = "AFWMBONQ2XGHWBTKVECDBBJWYEMS4DFIXIJML4VP76JQT5VWVLALE3KVKFEBAGWG3DOY53DK3H2EACWOBHJFYAIHDA3OFDQN2UAXI5TLBFOW4O2GWXNBGQ5QFMOJ5Z27HGYNO73DS5WPX2INNE47EGI6Z5UAAQAAAAEAAAIA"
|
def test_hardcoded_hash(self):
|
||||||
|
test_hash = "".join((l.strip() for l in """
|
||||||
|
AFWMBONQ2XGHWBTKVECDBBJWYEMS4DFIXIJML4VP76JQT5VWVLALE3KV
|
||||||
|
KFEBAGWG3DOY53DK3H2EACWOBHJFYAIHDA3OFDQN2UAXI5TLBFOW4O2G
|
||||||
|
WXNBGQ5QFMOJ5Z27HGYNO73DS5WPX2INNE47EGI6Z5UAAQAAAAEAAAIA
|
||||||
|
""".splitlines()))
|
||||||
|
pwinfo = parse_hash(test_hash)
|
||||||
|
self.assertTrue(check_pass("helloworld", pwinfo),
|
||||||
|
"check pass with correct password")
|
||||||
|
self.assertFalse(check_pass("foobar", pwinfo),
|
||||||
|
"check pass with wrong password")
|
||||||
|
|
||||||
def main():
|
def test_invalid_hash(self):
|
||||||
print(gen_pwhash("helloworld"))
|
with self.assertRaises(Exception):
|
||||||
print("------------")
|
parse_hash("sdlfkjdsklfjdsk")
|
||||||
print(check_pass_from_hash("hElloworld", test_hash))
|
|
||||||
print(check_pass_from_hash("helloworld", "foobar"))
|
|
||||||
print("------------")
|
|
||||||
print(check_pass_from_hash("helloworld", test_hash))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user