通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,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.1
cryptography==38.0.1
Django==4.2
django-sslserver
fido2==1.1.1
pycparser==2.21
pytz==2022.5
sqlparse==0.4.3
django-passkeys
可以放入requirements.txt进行批量安装。
随后在终端通过命令创建Django命令:
django-admin startproject test_app
需要注意的是,由于触发生物识别的接口只支持https协议,所以需要django-sslserver启动基于Https协议的后台服务,确保配置文件中已经进行配置:
# Application definition
INSTALLED_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 StatReloader
Validating 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:55
Django version 4.2, using settings 'test_app.settings'
Starting development server at https://0.0.0.0:8000/
Using SSL certificate: D:/Downloads/server.crt
Using SSL key: D:/Downloads/server.key
Quit 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'): admin
Email address: admin@123.net
Password:
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]: y
Superuser created successfully.
这里创建了一个admin账号。
随后访问地址:https://localhost:8000 ,注意,必须是https协议。
随后在passkeys管理页面中创建私钥:

由于笔者的电脑不支持生物识别,所以只能用pin码。
创建成功后,私钥会留在设备中,也就是客户端,通过生物识别来解锁。
而公钥则存在Django项目的Sqllite3数据库中,随时可以对用户的私钥进行验签操作。
下次登录的时候,只需要用私钥登录即可,把密码丢到九霄云外去吧:

结语
虽然这只是非对称加密算法的一次简单地落地实践,但却是用户登录体验的一次革命性的巨大提升,还在给1password软件付费?这笔开支可以省了,最后奉上Passkeys示例项目,与众乡亲同飨:
https://github.com/zcxey2911/Django4.2_Passkeys_Login_Demo
通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)的更多相关文章
- 多台Linux服务器SSH相互访问无需密码--转
一.环境配置 1.系统:CentOS release 5.6 IP:192.168.4.200 主机名:JW01 2.系统:CentOS release 5.9 IP:192.168.4. ...
- Win10共享打印机所需要的设置(无需密码访问实现打印机共享,共享不要密码)
原文:https://m.baidu.com/from=1086k/bd_page_type=1/ssid=0/uid=0/pu=usm@0,sz@1320_1002,ta@iphone_2_5.1_ ...
- SSH应该使用密钥还是密码?
关于SSH,几乎每个人都同意密钥要优于密码,更安全,并且更先进,但我并不同意这个观点. 虽然密钥的确可以更好,但它有着还没被意识到的严重风险,并且我认为比得到妥善管理的密码更不安全. 通常密钥更好的理 ...
- 普通用户su 到root,无需密码方式,及iptables封掉本机某个端口,core文件配置
一. 普通用户su到root无需密码: 随着服务器越来越多,普通用户转到root下,去查密码表是个很繁琐的事,发现有如下方式比较方便(需要root操作) vi /etc/pam.d/su 将 aut ...
- centos使用密钥替换密码登录服务器
一.首先登陆centos,切换用户,切换到你要免密码登陆的用户,进入到家目录,以下我以admin为例,命令:su admincd ~ 二.创建钥匙,命令:ssh-keygen -t rsa,一路按Y搞 ...
- 给指定的用户无需密码执行 sudo 的权限
给指定的用户无需密码执行 sudo 的权限 cat /etc/passwd 可以查看所有用户的列表 w 可以查看当前活跃的用户列表 cat /etc/group 查看用户组 cat /etc/pass ...
- [Apple开发者帐户帮助]四、管理密钥(3)撤消,编辑和下载密钥
创建密钥后,您可以撤消,编辑或下载密钥.您只能下载一次密钥.私钥在iOS,tvOS和watchOS上的应用程序之间共享. 所需角色:帐户持有人或管理员. 撤销密钥 如果撤消密钥,它将变为无效并影响使用 ...
- sshd服务及基于密钥远程登陆(无需密码)
上一条博客说明了用sshd服务远程登陆另一个系统,但是需要密码,如果不用密码呢?有没有简便的方法呢?下面为大家介绍一下,也就是基于密钥的安全验证:需要在本地生成”密钥对“后将公钥传送至服务端,进行公共 ...
- redhat6.2下的ssh密钥免密码登录(原创)
这个是我自己写的,鼓励转载,请说明转载地址:http://www.cnblogs.com/nucdy/p/5664840.html 在进行hadoop的免密码的登录操作是,老是发生no route等错 ...
- 使用 ESP8266 制作 WiFi 干扰器 - 无需密码即可使用任何 WiFi
嘿,朋友,我是 Kedar,你有没有想阻止所有的 WiFi信号?或者只是想从 WiFi 踢某人或邻居 WiFi .那么,本玩法是你等待结束的时刻了.这是为你提供的.仅需 $8 的 DIY Wifi 干 ...
随机推荐
- 深入理解 python 虚拟机:令人拍案叫绝的字节码设计
深入理解 python 虚拟机:令人拍案叫绝的字节码设计 在本篇文章当中主要给大家介绍 cpython 虚拟机对于字节码的设计以及在调试过程当中一个比较重要的字段 co_lnotab 的设计原理! p ...
- Kubernetes(k8s)二进制高可用安装脚本
好久没写公众号了,昨天新写了一个v1.24版本的安装.写得不咋样,但是能用.最近不高产了,没灵感了 = . = 手动部署:https://github.com/cby-chen/Kubernetes ...
- mesql输入中文报错
错误提示:ERROR 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE5\x8B\x87' for column 'Sname' at ro ...
- node使用node-xlsx实现excel的下载与导入,保证你看的明明白白
需求简介 很多时候,我们都会有这样一个业务. 将列表中的数据导出为excel. 这样做的目的是为了方便查看,同时可以保存在本地归档. 还可以将导出的Excel后的数据进行加工. node-xlsx 的 ...
- JUC(三)集合的线程安全
目录 集合的线程安全 list集合线程不安全演示 Vector解决 Collections.synchronizedList JUC 解决方案:CopyOnWriteArrayList HashSet ...
- R的画图
关于R基础 有3个需要总结的地方 R的画图(统计学图,ggplot) R的基本语法 R dataframe相关 Plot plot(1,2) plot(c(1, 2, 3, 4, 5), c(3, 7 ...
- 详解Redis三大集群模式,轻松实现高可用!
1. Redis集群简介 1.1 什么是Redis集群 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性.数据分片和负载均衡的技术.它允许Redis在不同节点上同时提供服务,提高整 ...
- vue中父组件给子组件传值的方法
顺序............................................. -------------列表组件,注册组件.调用使用组件----------------- 1,子组件 ...
- 获取电脑的网络连接状态(三)Ping
网络连接判断,使用ping测试获取: 1 private static async Task<bool> IsPingSuccess() 2 { 3 try 4 { 5 using (Pi ...
- Win YAPI + Jenkins 实现接口自动化测试
自动化测试 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的. 为了解决这个问题,使用YAPI接口自动化测试功能,只需要配置每个接口的 ...