Passkeys实现无密码登录
毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率先支持了Passkeys登录方式,只须在设备上利用PIN码解锁、指纹或面部辨识等生物识别方式,即可验证身份,也就是说,可以和密码说拜拜了。
(相关资料图)
什么是PassKeys
Passkeys的原理很简单,就是在用户注册环节,可以选择生成一对密钥,分别是公钥和私钥,公钥存在服务器端,而私钥存在用户需要登录的设备上,包含但不限于电脑、手机、或者平板。
只有在公钥和私钥配对,并且验签通过的情况下,系统才会判定用户登录成功,也就是说,就算黑客进入到了服务器,窃取到了用户的公钥,仍然无法伪造用户的身份。
另一方面,当我们在客户端登录账户的时候,可以选择安全性相对较高的PIN码解锁、指纹或面部辨识等生物识别方式解锁私钥,如此,就算设备不慎遗失,也可以确保私钥的安全性,不会被恶意使用。
以Google账户为例子,只需要登入Google的账号首页:
account.google.com
随后在右侧菜单选择安全性-》通行密钥,随后创建通行密钥即可,以后如果想登录Google账号的时候,直接使用通行密钥进行生物识别登录即可,当然,前提是当前设备需要支持指纹识别或者面部识别等功能,实在不行,也可以用pin码登录,比使用冗长的密码要方便多了。
如果需要通过多台设备进行登录,则可以在对应设备上创建不同的通行密钥,如此在任意设备登录账号都不需要输入密码了,需要注意的是,如果想把设备出售,可以在服务端直接删除公钥,这样设备中的私钥也会失效,确保账户的安全。
总的来说,Passkeys就是一种基于非对称加密算法的登录验证方式,只不过私钥和生物识别技术连结了起来,比传统私钥更加的安全,关于非对称加密算法,请移步:加密,各种加密,耙梳加密算法(Encryption)种类以及开发场景中的运用(Python3.10) ,这里不再赘述。
基于Django4.2实现
Google账户的Passkeys支持是极好的,那么如果我们想在自己的平台接入Passkeys功能, 该如何做呢?这里以基于Python3.10的Web框架Django4.2为例子进行演示。
首先安装Django4.2
pip3 install Django==4.2
接着安装相关的其他依赖:
cffi==1.15.1cryptography==38.0.1Django==4.2django-sslserverfido2==1.1.1pycparser==2.21pytz==2022.5sqlparse==0.4.3django-passkeys
可以放入requirements.txt进行批量安装。
随后在终端通过命令创建Django命令:
django-admin startproject test_app
需要注意的是,由于触发生物识别的接口只支持https协议,所以需要django-sslserver启动基于Https协议的后台服务,确保配置文件中已经进行配置:
# Application definitionINSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "test_app", "passkeys", "sslserver"]
随后,配置一下数据库:
DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": "test_db", }}
这里我们就使用默认的简易数据库sqlite3,当然换成Mysql也可以,原理都是一样的,数据库用来存储用户生成的公钥,存在服务端。
至此Django4.2就配置好了。
使用Openssl配置证书
想要启动基于Https协议的Django服务,需要单独配置SSL的证书,这里使用Openssl,下载地址是:
https://slproweb.com/products/Win32OpenSSL.html
下载后进行安装,别忘了配置环境变量,随后第一步,生成服务器私钥:
openssl genrsa -out server.key 2048
第二步,根据私钥和输入的信息生成证书请求文件:
openssl req -new -key server.key -out server.csr
第三步:用第一步的私钥和第二步的请求文件生成证书:
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650
这样我们就拿到了私钥server.key和证书server.crt。
在生产环境中,这些步骤对用户来说是不可见的,这里只是简单模拟,通常证书申请用户只需要将服务器的公钥(注意不是私钥)和服务器证书申请文件交给https证书厂商即可,之后https厂商会通过邮件回复一个服务器公钥证书,拿到这个证书和自己生成的服务器私钥就可以搭建https应用了。
需要注意的是,私钥长度必须大于1024,否则启动时会报密钥过短的错误,同时密钥如果过短,也会增加被破解的风险。
随后用证书启动Django服务:
python3 manage.py runsslserver --cert D:/Downloads/server.crt --key D:/Downloads/server.key 0.0.0.0:8000
程序返回:
Watching for file changes with StatReloaderValidating models...System check identified some issues:WARNINGS:passkeys.UserPasskey: (models.W042) Auto-created primary key used when not defining a primary key type, by default "django.db.models.AutoField". HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. "django.db.models.BigAutoField".System check identified 1 issue (0 silenced).June 21, 2023 - 12:22:55Django version 4.2, using settings "test_app.settings"Starting development server at https://0.0.0.0:8000/Using SSL certificate: D:/Downloads/server.crtUsing SSL key: D:/Downloads/server.keyQuit the server with CTRL-BREAK.
则代表没有问题,至此证书就配置好了。
使用Passkeys
现在,我们可以使用Passkeys功能了,首先迁移数据库:
python3 manage.py migrate
注意这一步并不需要model的支持,因为django-passkeys三方库会自动创建。
随后为Django-admin后台创建一个超级管理员:
python3 manage.py createsuperuser
程序返回:
System check identified some issues:WARNINGS:passkeys.UserPasskey: (models.W042) Auto-created primary key used when not defining a primary key type, by default "django.db.models.AutoField". HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. "django.db.models.BigAutoField".Username (leave blank to use "zcxey"): adminEmail address: admin@123.netPassword:Password (again):The password is too similar to the username.This password is too short. It must contain at least 8 characters.This password is too common.Bypass password validation and create user anyway? [y/N]: ySuperuser created successfully.
这里创建了一个admin账号。
随后访问地址:https://localhost:8000 ,注意,必须是https协议。
随后在passkeys管理页面中创建私钥:
由于笔者的电脑不支持生物识别,所以只能用pin码。
创建成功后,私钥会留在设备中,也就是客户端,通过生物识别来解锁。
而公钥则存在Django项目的Sqllite3数据库中,随时可以对用户的私钥进行验签操作。
下次登录的时候,只需要用私钥登录即可,把密码丢到九霄云外去吧:
结语
虽然这只是非对称加密算法的一次简单地落地实践,但却是用户登录体验的一次革命性的巨大提升,还在给1password软件付费?这笔开支可以省了,最后奉上Passkeys示例项目,与众乡亲同飨:
https://github.com/zcxey2911/Django4.2_Passkeys_Login_Demo
相关新闻
- Passkeys实现无密码登录
- 今日影评 | 《我爱你!》:黄昏,与你在一起 热消息
- 世界报道:群众文化副研究馆员职称评定条件(副研究馆员是什么职称 高级)
- 焦点短讯!工银瑞信旗下三只基金参与金雷股份定增
- 秋水伊人是啥意思?_请问秋水伊人是什么意思
- 资讯推荐:司机分神开车冲入羊群:撞死20只羊
- 多地再掀购车补贴潮:车市“价格战”仍将持续?
- 世界快报:生皮是什么中药_生皮是什么
- 太原局集团公司今年前5月发送煤炭2.77亿吨_环球动态
- 南华期货06月21日被沪股通减持8.83万股 全球观天下
- 唐鸿伟:6.21黄金低位开多如期大涨,原油70.8多同样如期大涨 天天观热点
- 全球新动态:使用 Bash 制作 Web 安全颜色
- 中华五岳之首_中华五岳
- 意天空:皮尔洛可能执教莱切,大因扎吉和詹保罗也是候选
- 全球实时:264亿元收购煤炭资产引关注 兖矿能源回应市场热点问题
- 小洋芋头家常做法?_全球滚动
- 广西有哪些好的二本大学排名_广西有哪些好一点的二本大学-全球时讯
- 世界今头条!暴跌、“中国好前妻”减持!漩涡中的昆仑万维
- 家用瓷砖的分类可分为哪几类? 家装瓷砖品牌推荐
- 【环球热闻】理财保险的作用是什么?可靠吗?