python 练习0021
时间:2019-04-18
本文章向大家介绍python 练习0021,主要包括python 练习0021使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题
通常,登陆某个网站或者 APP,需要使用用户名和密码。密码是如何加密后存储起来的呢?请使用 Python 对密码加密。
阅读资料:
- 用户密码的存储与 Python 示例
- Hashing Strings with Python
- Python’s safest method to store and retrieve passwords from a database
代码
import secrets
from hmac import HMAC
from hashlib import sha256
def encrypt_password(password, salt=None):
if salt == None:
# secrets.token_hex(n) 注释:
# Return a random text string, in hexadecimal. The string has nbytes random bytes,
# each byte converted to two hex digits
# 生成随机 32 bytes salt(256 bits),其实生成了64 位? (没搞清楚..
salt = secrets.token_hex(32)
# print(type(salt))
if isinstance(salt, str):
# print('salt is unicode', salt, ' ', len(salt))
salt = salt.encode('utf-8')
if isinstance(password, str):
# print('password is unicode ', password)
password = password.encode('utf-8')
result = password
for i in range(10):
# digest 生成字符串摘要,hexdigest 生成 16 进制摘要
result = HMAC(result, salt, sha256).hexdigest().encode('utf-8')
return salt + result
def validate_password(hashed, password):
return hashed == encrypt_password(password, hashed[:64])
if __name__ == '__main__':
password = 'this is password'
print('='*50)
hashed_password = encrypt_password(password)
print('hashed_password is ', hashed_password)
print('='*50)
if validate_password(hashed_password, password):
print('ecrypt successfully!')
else:
print('no no no')
注释
- 关于 Python3 中的
bytes
和str
类型,可以参考 Python3中的bytes和str类型 secret
模块参考资料 Generate secure random numbers for managing secrets
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Docker安装及使用
- CVE-2020-0796漏洞复现(RCE)
- Jenkins持续集成平台安装
- mysql架构备份之M-S-S级联复制
- Docker构建lnmp环境部署typecho
- MANJARO KDE安装配置(已换Arch Linux,此贴可能废弃)
- [数据库推荐]qPCR引物设计与评价
- markdown数学公式
- C++核心准则T.2:使用模板表现可以适用于多种参数类型的算法
- C++核心准则T.3:使用模板表现容器和范围
- Markdown的时序图、流程图、和甘特图+Hexo的相关配置
- 记一次Fcitx5的安装
- 解决KDE下KDE Wallet重装系统后每次登陆需要输入密码
- KDE下完美的Unity桌面体验,扔掉active window control
- C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本