#普通MD5加密
import hashlib
def cac_md5(password):
md5_3 = hashlib.md5()
md5_3.update(f'{password}'.encode('utf-8'))
return md5_3.hexdigest()
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
def login(user,password):
hashlib_pws = cac_md5(password)
return hashlib_pws == db[user]
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
#带盐值MD5加密
import hashlib,random
class User(object):
def __init__(self,username,password):
self.username = username
self.password = password
self.salt = ''.join([chr(random.randint(48, 122))for i in range(20)])
self.password=get_md5(self,password)
def get_md5(user,pws):
md5_3=hashlib.md5()
md5_3.update(f'{pws+user.salt}'.encode('utf-8'))
return md5_3.hexdigest()
db={
'michael': User('michael', '123456'),
'bob': User('bob', 'abc999'),
'alice': User('alice', 'alice2008')
}
def login(username,password):
user=db[username]
return user.password==get_md5(user,password)
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')
# your code goes here
I+aZrumAmk1ENeWKoOWvhgoKaW1wb3J0IGhhc2hsaWIKCmRlZiBjYWNfbWQ1KHBhc3N3b3JkKToKICAgIG1kNV8zID0gaGFzaGxpYi5tZDUoKQogICAgbWQ1XzMudXBkYXRlKGYne3Bhc3N3b3JkfScuZW5jb2RlKCd1dGYtOCcpKQogICAgcmV0dXJuIG1kNV8zLmhleGRpZ2VzdCgpCgpkYiA9IHsKICAgICdtaWNoYWVsJzogJ2UxMGFkYzM5NDliYTU5YWJiZTU2ZTA1N2YyMGY4ODNlJywKICAgICdib2InOiAnODc4ZWY5NmU4NjE0NTU4MGMzOGM4N2YwNDEwYWQxNTMnLAogICAgJ2FsaWNlJzogJzk5YjFjMjE4OGRiODVhZmVlNDAzYjE1MzYwMTBjMmM5Jwp9CgpkZWYgbG9naW4odXNlcixwYXNzd29yZCk6CiAgICBoYXNobGliX3B3cyA9IGNhY19tZDUocGFzc3dvcmQpCiAgICByZXR1cm4gaGFzaGxpYl9wd3MgPT0gZGJbdXNlcl0KCmFzc2VydCBsb2dpbignbWljaGFlbCcsICcxMjM0NTYnKQphc3NlcnQgbG9naW4oJ2JvYicsICdhYmM5OTknKQphc3NlcnQgbG9naW4oJ2FsaWNlJywgJ2FsaWNlMjAwOCcpCmFzc2VydCBub3QgbG9naW4oJ21pY2hhZWwnLCAnMTIzNDU2NycpCmFzc2VydCBub3QgbG9naW4oJ2JvYicsICcxMjM0NTYnKQphc3NlcnQgbm90IGxvZ2luKCdhbGljZScsICdBbGljZTIwMDgnKQoKI+W4puebkOWAvE1ENeWKoOWvhgppbXBvcnQgaGFzaGxpYixyYW5kb20KCmNsYXNzIFVzZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLHVzZXJuYW1lLHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKICAgICAgICBzZWxmLnNhbHQgPSAnJy5qb2luKFtjaHIocmFuZG9tLnJhbmRpbnQoNDgsIDEyMikpZm9yIGkgaW4gcmFuZ2UoMjApXSkKICAgICAgICBzZWxmLnBhc3N3b3JkPWdldF9tZDUoc2VsZixwYXNzd29yZCkKCmRlZiBnZXRfbWQ1KHVzZXIscHdzKToKICAgIG1kNV8zPWhhc2hsaWIubWQ1KCkKICAgIG1kNV8zLnVwZGF0ZShmJ3twd3MrdXNlci5zYWx0fScuZW5jb2RlKCd1dGYtOCcpKQogICAgcmV0dXJuIG1kNV8zLmhleGRpZ2VzdCgpCgpkYj17CiAgICAnbWljaGFlbCc6IFVzZXIoJ21pY2hhZWwnLCAnMTIzNDU2JyksCiAgICAnYm9iJzogVXNlcignYm9iJywgJ2FiYzk5OScpLAogICAgJ2FsaWNlJzogVXNlcignYWxpY2UnLCAnYWxpY2UyMDA4JykKfQoKZGVmIGxvZ2luKHVzZXJuYW1lLHBhc3N3b3JkKToKICAgIHVzZXI9ZGJbdXNlcm5hbWVdCiAgICByZXR1cm4gdXNlci5wYXNzd29yZD09Z2V0X21kNSh1c2VyLHBhc3N3b3JkKQoKYXNzZXJ0IGxvZ2luKCdtaWNoYWVsJywgJzEyMzQ1NicpCmFzc2VydCBsb2dpbignYm9iJywgJ2FiYzk5OScpCmFzc2VydCBsb2dpbignYWxpY2UnLCAnYWxpY2UyMDA4JykKYXNzZXJ0IG5vdCBsb2dpbignbWljaGFlbCcsICcxMjM0NTY3JykKYXNzZXJ0IG5vdCBsb2dpbignYm9iJywgJzEyMzQ1NicpCmFzc2VydCBub3QgbG9naW4oJ2FsaWNlJywgJ0FsaWNlMjAwOCcpCnByaW50KCdvaycpCiMgeW91ciBjb2RlIGdvZXMgaGVyZQ==