网站首页 > 技术文章 正文
开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种
- 明文存储:肉眼就可以识别,没有任何安全性。 谁用谁傻缺
- 加密存储:通过一定的变换形式,使得密码原文不易被识别。
密码加密的几类方式:
- 明文转码加密:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。它是一种可逆的加密。
- 对称算法加密:DES, AES等,如果密钥泄露,加密就会失效了。
- 签名算法加密:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容易被暴力破解。如果密码相同,得到的哈希值是一样的。
如果你只是简单的使用md5将用户的密码进行加密,那么如果你的库被别人拖了,现在有很多可以直接反查的网络工具就可以进行暴力破解,那么能不能有一种方法,用户的明文密码即使多次使用,但是数据库中记录的加密密码也是不同的,这样即使数据库被拖了,那么也很难暴力破解,真的有这种方法吗?
答案是肯定的,有一种加密方式叫加盐哈希加密,加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运用这种加密方法
werkzeug介绍
Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。但是 werkzeug 不是一个 web 服务器,也不是一个 web 框架,而是一个工具包,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等,大名鼎鼎的Flask就是基于werkzeug开发的。
安装 werkzeug
pip install Werkzeug
密码生成函数 generate_password_hash
可以看到,密码是123,但是使用该函数每次计算出来的值都是不一样的
'pbkdf2:sha256:50000$fESwY4Cl$38fdf741069ef37c207211b9bee69514582dc366660563d75c00e7cbfd7cbd8a'
'pbkdf2:sha256:50000$hUhR8Gr3$73d44814d5cd490c04e0559141fb327c31766a0314d82ee05e33c33e1559af78'
这样即使你的数据库被黑客拖了,通过暴力破解也是非常困难的。
generate_password_hash 函数定义为
generate_password_hash(password, method='pbkdf2:sha256', salt_length=8)
参数 「password」 为明文密码,「method」 哈希的方式,格式为 pbpdf2:<method> 主要有sha1,sha256,md5
salt_length 盐值的长度,默认为8
>>> generate_password_hash('123',method='pbkdf2:sha1',salt_length=10)
'pbkdf2:sha1:50000$4GUBRzzizn$45b0f6b84a4ca4352b45feea8283fc48186f9ee8'
>>> generate_password_hash('123',method='pbkdf2:sha1',salt_length=8)
'pbkdf2:sha1:50000$4kHPpS9R$1f87c09c052342fd0d65b75aa70ababb1c17e7df'
>>> generate_password_hash('123',method='pbkdf2:md5',salt_length=8)
'pbkdf2:md5:50000$zppMHqux$01acb41e0b2858bbc849abf77692a9c0'
>>> generate_password_hash('123',method='pbkdf2:md5',salt_length=8)
'pbkdf2:md5:50000$rMaQutjR$1cc67c05e063cec0c8e5f8e048ddb5e1'
密码验证函数:check_password_hash
有生成函数就得有相应的解密函数,check_password_hash的定义为
check_password_hash(pwhash, password)
pwhash 为密文
password 为明文
相同则返回True,不同返回 False
>>> check_password_hash('pbkdf2:sha256:50000$ntpFkKsc$bd062cd0b35c5b26c91242fc72eb0e889cf71b9dd4c1ae291587a7a3e84db293','123')
True
>>> check_password_hash('pbkdf2:sha256:50000$ntpFkKsc$bd062cd0b35c5b26c91242fc72eb0e889cf71b9dd4c1ae291587a7a3e84db293','1234')
False
结语
这个加盐哈希加密以后的密文,放到另外一台服务器上也是可以校验通过的,如果做网站数据库迁移也不用重新生成数据,使用这套加密算法可以很大程度上规避暴力破解密码,还是那名老话,密码是123456的就算使用再牛逼的加密你依然是不安全的,另外撞库也是不可避免的,所以作为用户可以尝试不同的网站使用不同的密码来规避撞库问题。
感谢评论区里帮忙指正,RSA是非对称加密,DES和AES是对称加密,并且md5不算是加密算法,只能说它可以起到加密明文的效果。
由于今日头条上发的文章对于代码排版不太方便,所以我将代码片段都使用了截图的方式,想要复制代码请点击 "了解更多"来查看原文或者微信搜索公众号"序语程言"
猜你喜欢
- 2024-09-27 MD5 到底算不算一种加密算法? md5是数据加密算法吗
- 2024-09-27 通过一次安全处理暴露的问题 通过一次安全处理暴露的问题的英文
- 2024-09-27 加解密与HTTPS(3) 加解密服务器通讯异常
- 2024-09-27 Qt怎么使用MD5加密 md5在线加密解密工具
- 2024-09-27 Java加密体系(MD5算法) javamd5密钥加密解密
- 2024-09-27 Swift版StringExtention方法MD5加密
- 2024-09-27 浅谈MD5加密算法,头条官方工程师就是依此内容查重(小白勿进)
- 2024-09-27 用MD5加密为何不再安全了 md5加密后的值是唯一的吗
- 2024-09-27 openssl md5算法——Linux下(字符串加密、文件加密)
- 2024-09-27 Python实现各种加密,接口加解密不说难
你 发表评论:
欢迎- 最近发表
-
- 前端流行框架Vue3教程:13. 组件传递数据_Props
- 前端必看!10 个 Vue3 救命技巧,解决你 90% 的开发难题?
- JAVA和JavaScript到底是什么关系?是亲戚吗?
- Java和js有什么区别?(java和javascript的区别和联系)
- 东方标准|Web和Java的区别,如何选择这两个专业
- 前端面试题-JS 中如何实现大对象深度对比
- 360前端一面~面试题解析(360前端笔试)
- 加班秃头别慌!1 道 Vue 面试题,快速解锁大厂 offer 通关密码
- 焦虑深夜刷题!5 道高频 React 面试题,吃透 offer 稳了
- 2025Web前端面试题大全(整理版)面试题附答案详解,最全面详细
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)