python 密码验证(滑块验证)

目录
  • 题目描述:
  • 解题思路/算法分析/问题及解决
  • 实验代码

题目描述:

(1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入。用代替密码;或者最新输入显示,前面的变成;安全性措施。
(2)同时添加如下图的加强验证(京东)。
(3)在触动滚动条时再出现空缺位置。

拓展:

  • 增加注册页面,可供用户注册新用户
  • 增加数字验证码区别人机

解题思路/算法分析/问题及解决

滑块验证就是将滑块的移动和图片小块的移动相绑定,在滑块松开时触发相对应的检查函数,为了有一定的容错率,设定滑块的位置与设定的位置相差3个像素以内即算验证成功。

  • 每次的位置随机生成,同时随即从14张事先准备好的图片中选取一张作为背景图。
  • 图片小块和背景图片分别放在两个不同的QLabel容器中。
  • 每次刷新时将背景图片的相应位置抠出放于图片小块中,并将背景图片的相应部分置为白色以示区别。
  • 拓展:
  • 新增注册页部分就是点击按钮弹出注册页的对话框,可在里面输入新用户信息并保存到用户信息字典中,随后可用新注册的用户登录。
  • 数字验证码由4位数字0-9和字母a-z及A-Z组成,随机在可行字符集中选取4个字符组成四位验证码,然后自动生成验证码以图片的方式呈现给用户。

实验代码

登录主界面:
登录验证:

def check_login_func(self):
        if not self.validate_line.text():
            QMessageBox.warning(self, "警告", "还未输入验证码")
            return
        validate_slide = Validate_page()
        r = validate_slide.exec_()
        if not r:
            return
        if self.validate.upper() == self.validate_line.text().upper():
            if USER_PWD.get(self.user_line.text()) == self.pwd_line.text():
                QMessageBox.information(self, 'Information', 'Log in Successfully!')
                self.nums = 0
                self.refresh()
                # self.close()
                # self.STU.exec()
            else:
                QMessageBox.critical(self, 'Wrong', 'Wrong Username or Password!')
                self.nums = self.nums + 1
                if self.nums == 3:
                    QMessageBox.critical(self, "wrong", "密码输错次数已达三次!")
                    self.close()

            self.user_line.clear()
            self.pwd_line.clear()
            self.validate_line.clear()
        else:
            QMessageBox.critical(self, "wrong", "验证码输入有误!")
            self.refresh()
            self.validate_line.clear()

自动生成验证码图片:

def get_chars():
        """生成给定长度的字符串,返回列表格式"""

        return random.sample(chars, length)

    def create_lines():
        """绘制干扰线"""

        line_num = random.randint(*n_line)  # 干扰线条数

        for i in range(line_num):
            # 起始点
            begin = (random.randint(0, size[0]), random.randint(0, size[1]))
            # 结束点
            end = (random.randint(0, size[0]), random.randint(0, size[1]))
            draw.line([begin, end], fill=(0, 0, 0))

    def create_points():
        """绘制干扰点"""

        chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]

        for w in range(width):
            for h in range(height):
                tmp = random.randint(0, 100)
                if tmp > 100 - chance:
                    draw.point((w, h), fill=(0, 0, 0))

    def create_strs():
        """绘制验证码字符"""

        c_chars = get_chars()
        strs = ' %s ' % ' '.join(c_chars)  # 每个字符前后以空格隔开

        font = ImageFont.truetype(font_type, font_size)
        font_width, font_height = font.getsize(strs)

        draw.text(((width - font_width) / 3, (height - font_height) / 3),
                  strs, font=font, fill=fg_color)

        return ''.join(c_chars)

    if draw_lines:
        create_lines()
    if draw_points:
        create_points()
    strs = create_strs()

    # 图形扭曲参数
    params = [1 - float(random.randint(1, 2)) / 100,
              0,
              0,
              0,
              1 - float(random.randint(1, 10)) / 100,
              float(random.randint(1, 2)) / 500,
              0.001,
              float(random.randint(1, 2)) / 500
              ]
    img = img.transform(size, Image.PERSPECTIVE, params)  # 创建扭曲

    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强(阈值更大)

    mstream = io.BytesIO()
    img.save(mstream, img_type)

    if save_img:
        img.save("validate.jpg", img_type)

    return mstream, strs

注册界面部分:
页面初始化:

def __init__(self):
        super(SigninPage, self).__init__()
        self.signin_user_label = QLabel('Username:', self)
        self.signin_pwd_label = QLabel('Password:', self)
        self.signin_pwd2_label = QLabel('Password:', self)
        self.signin_user_line = QLineEdit(self)
        self.signin_pwd_line = QLineEdit(self)
        self.signin_pwd2_line = QLineEdit(self)
        self.signin_button = QPushButton('Sign in', self)

        self.user_h_layout = QHBoxLayout()
        self.pwd_h_layout = QHBoxLayout()
        self.pwd2_h_layout = QHBoxLayout()
        self.all_v_layout = QVBoxLayout()

        self.lineedit_init()
        self.pushbutton_init()
        self.layout_init()

    def layout_init(self):
        self.user_h_layout.addWidget(self.signin_user_label)
        self.user_h_layout.addWidget(self.signin_user_line)
        self.pwd_h_layout.addWidget(self.signin_pwd_label)
        self.pwd_h_layout.addWidget(self.signin_pwd_line)
        self.pwd2_h_layout.addWidget(self.signin_pwd2_label)
        self.pwd2_h_layout.addWidget(self.signin_pwd2_line)

        self.all_v_layout.addLayout(self.user_h_layout)
        self.all_v_layout.addLayout(self.pwd_h_layout)
        self.all_v_layout.addLayout(self.pwd2_h_layout)
        self.all_v_layout.addWidget(self.signin_button)

        self.setLayout(self.all_v_layout)

    def lineedit_init(self):
        self.signin_user_line.setPlaceholderText("username")
        self.signin_pwd_line.setPlaceholderText("password")
        self.signin_pwd2_line.setPlaceholderText("password again")

        self.signin_pwd_line.setEchoMode(QLineEdit.Password)
        self.signin_pwd2_line.setEchoMode(QLineEdit.Password)

        self.signin_user_line.textChanged.connect(self.check_input_func)
        self.signin_pwd_line.textChanged.connect(self.check_input_func)
        self.signin_pwd2_line.textChanged.connect(self.check_input_func)

注册检验部分:

def check_signin_func(self):
        if self.signin_pwd_line.text() != self.signin_pwd2_line.text():
            QMessageBox.critical(self, 'Wrong', 'Two Passwords Typed Are Not Same!')
        elif self.signin_user_line.text() not in USER_PWD:
            USER_PWD[self.signin_user_line.text()] = self.signin_pwd_line.text()
            QMessageBox.information(self, 'Information', 'Register Successfully')
            self.close()
        else:
            QMessageBox.critical(self, 'Wrong', 'This Username Has Been Registered!')

        self.signin_user_line.clear()
        self.signin_pwd_line.clear()
        self.signin_pwd2_line.clear()

滑块验证部分:

class Validate_page(QDialog):
    def __init__(self):
        super(Validate_page, self).__init__()
        self.resize(600, 500)
        self.setWindowTitle("拖动滑块验证")
        self.initUI()
        self.Widget_init()
        self.refresh()
        # self.show()

    def initUI(self):
        # 初始化相关控件位置
        self.lb_bg = QLabel(self)
        self.lb_sl = QLabel(self)

        self.lb_bg.setStyleSheet("border: 2px solid red")
        # self.lb_sl.setStyleSheet("border: 2px solid blue")
        self.lb_bg.setGeometry(100, 100, 400, 200)

        self.lb_wz = QLabel(self)
        # self.lb_wz.setStyleSheet("border: 2px solid green")

        self.refresh()

        self.button = QPushButton("取消", self)
        self.button.setGeometry(400, 430, 100, 50)

        self.slider = QSlider(Qt.Horizontal, self)
        self.slider.setGeometry(100, 350, 400, 50)

    def Widget_init(self):
        # 初始化相关组件的信号连接
        self.slider.setMinimum(0)
        self.slider.setMaximum(360)
        self.slider.valueChanged.connect(self.slide)
        self.slider.sliderReleased.connect(self.check)
        self.button.clicked.connect(self.cancel)

    def slide(self, value):
        self.lb_sl.move(100 + value, self.answer_y)  # 将滑块与图片小块绑定
        # print(value)

    def refresh(self):
        import random
        # 随机生成验证区域
        self.answer_x = random.randint(100, 460)
        self.answer_y = random.randint(100, 260)
        pic = random.randint(0, 14)

        self.lb_sl.setGeometry(100, self.answer_y, 40, 40)
        self.lb_wz.setGeometry(self.answer_x, self.answer_y, 40, 40)
        img = cv2.imread(f"pic/{pic}.jpeg")  # 读取背景图片
        img = cv2.resize(img, (400, 200))
        x = self.answer_x - 100
        y = self.answer_y - 100
        img1 = copy.copy(img[y:y + 40, x:x + 40])  # 扣40*40的图片小块
        img[y:y + 40, x:x + 40] = 255  # 将被扣区域置为白色
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

        qt_img = QImage(img.data, 400, 200, QImage.Format_RGB888)
        qt_img1 = QImage(img1.data, 40, 40, QImage.Format_RGB888)
        self.lb_bg.setPixmap(QPixmap.fromImage(qt_img))
        self.lb_sl.setPixmap(QPixmap.fromImage(qt_img1))

    def check(self):  # 检验滑动验证是否成功
        # 获取设定区域坐标
        x = self.lb_sl.pos().x()
        y = self.lb_sl.pos().y()
        print(f"({x},{y})")
        if abs(x - self.answer_x) <= 3:  # 容错为3px
            QMessageBox.information(self, "恭喜", "验证成功")
            self.done(1)
        else:
            QMessageBox.critical(self, "错误", "验证失败")
            self.slider.setValue(0)
            self.refresh()

    def cancel(self):
        self.done(0)  # 点击取消滑动验证

运行结果

全部背景图片:

注册界面:

完整代码

到此这篇关于python 密码验证(滑块验证)的文章就介绍到这了,更多相关python 密码验证(滑块验证)内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现密码验证合格程序的思路详解

    题目描述 输入一行或多行字符串密码,验证每行密码是否符合规范,符合提示"OK",否则"NG".密码规范为: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有相同长度超2的子串重复 解题思路 1.获取输入的多行字符串 2.对每行字符串进行密码验证: 1)如果密码长度小于等于8或者是密码中有长度超过2的重复子串,则密码NG 2)在1)不满足的情况下再看有没有至少包含大写字母.小写字母.数字.其他符号 python代码实现 import

  • 详解Python中的自定义密码验证

    目录 在测试:nut_and_bolt:️之前 试验contains_character TestContainsCharacter字符 试验is_valid_size TestIsValidSize 试验is_valid_password TestIsValidPassword 重构is_valid_password 结论 这些帖子将分为三个部分. 1.密码验证功能 2.重构密码验证函数 3.对密码验证功能进行单元测试 这是Python系列中自定义密码验证的第三部分,也是最后一部分.我们将看看

  • Python使用selenium实现网页用户名 密码 验证码自动登录功能

    好久没有学python了,反正各种理由吧(懒惰总会有千千万万的理由),最近网上学习了一下selenium,实现了一个简单的自动登录网页,具体如下. 1.安装selenium: 如果你已经安装好anaconda3,直接在windows的dos窗口输入命令安装selenium: python -m pip install --upgrade pip 查看版本pip show selenium 2.接着去http://chromedriver.storage.googleapis.com/index.

  • Python实现破解网站登录密码(带token验证)

    目录 前言 关键代码解释 完整代码 运行结果 补充 前言 上一篇暴力破解文章:一个简单的Python暴力破解网站登录密码脚本 测试靶机为Pikachu漏洞练习平台暴力破解模块下的 “token防爆破?” 春节期间歇了一阵子,吃睡玩看小说.写这个脚本的起因是因为burp设置带token的暴力破解我只会用pitchfork草叉模式,要是用cluster bomb集束炸弹模式笛卡儿积那样就不会了,所以就干脆把之前写的脚本加了点东西实现这个功能了,到时候有空再学学多线程,爆破速度就更快了. 关键代码解释

  • python实现三次密码验证的示例

    需求:Python实现三次密码验证,每次验证结果需要提示,三次验证不通过需要单独提示 代码如下: user = '张无忌' password = '12345678' confirm_flag = True for i in range(0, 3): user_input = input('user:') password_input = input('password:') if user_input == user and password_input == password: print(

  • python 密码验证(滑块验证)

    目录 题目描述: 解题思路/算法分析/问题及解决 实验代码 题目描述: (1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入.用代替密码:或者最新输入显示,前面的变成:安全性措施.(2)同时添加如下图的加强验证(京东).(3)在触动滚动条时再出现空缺位置. 拓展: 增加注册页面,可供用户注册新用户 增加数字验证码区别人机 解题思路/算法分析/问题及解决 滑块验证就是将滑块的移动和图片小块的移动相绑定,在滑块松开时触发相对应的检查函数,为了有一定的容错率,设定滑块的位置与设

  • Python 网易易盾滑块验证功能的实现

    目录 操作环境 分析 解决方案 使用selenium请求url,并触发滑块验证 获取验证图片并计算滑块距离 生成滑动轨迹 滑动模块 效果 资源下载 记一次 网易易盾滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.PIL.numpy.scipy.matplotlib 分析 网易易盾滑块验证,就长下面这个样子 具体验证原理有兴趣的可自行查询官方文档:网易易盾开发文档 话不多少,借助之前写阿里云盾滑块和极验滑块的经验,直接上代码,详细可参考:[python3

  • python3.8.1+selenium实现登录滑块验证功能

    python3.8.1+selenium解决登录滑块验证的问题,先给大家分享一个效果图,感觉不错,可以参考实现代码. 这里的滑块是qq邮箱的截图,如图所示,可以作为同类滑块验证的参考. """ auther = "zwb",这里使用的python版本是3.8.1,selenium版本是3.141.0,webdriver是谷歌,版本是81.0.4044.138(正式版本) (64 位) webdriver各版本对应的浏览器下载地址:https://npm.t

  • Python模拟用户登录验证

    本文实例为大家分享了Python模拟用户登录验证的具体代码,供大家参考,具体内容如下 1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单中的用户被锁定不能再登陆. 2.实现方法 本程序采用python语言编写,将各项任务进行分解并用定义对应的函数来处理,从而使程序结构清晰,易于维护.主要编写了四个函数: login() #登陆函数,为主函数,完成用

  • 使用selenium模拟登录解决滑块验证问题的实现

    本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟请求,需要的参数太多了,找的心累.不过好在TX的滑块验证是他们自己开发的,没有极验那么复杂,当然相反的,想要模拟就得自己去一点点探索了,毕竟对极验滑块的破解,网上已经可以找到现成的代码来用了.下面说一下模拟的实现过程和我遇见的问题. 1.登录入口 我是通过点击打开链接来当做登录入口的 部分代码实现: driver = webdriver.Chrom

  • Python实现的登录验证系统完整案例【基于搭建的MVC框架】

    本文实例讲述了Python实现的登录验证系统.分享给大家供大家参考,具体如下: 小型登录注册验证系统 一.概述 ​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统.在这个系统中初步了解认识MVC框架. ​ 具备功能:登录.注册.改密.注销. ​ 数据库:Redis,MySQL.使用Redis把用户信息存储在内存中,查询数据快.MySQL存储空间更大,对表之间的关系管理更好.两者结合使用发挥各自的优势已是当下流行的数据库使用方式. ​ 开发语言:Python. ​ MVC框架:MV

  • selenium 反爬虫之跳过淘宝滑块验证功能的实现代码

    在处理问题的之前,给大家个第一个锦囊! 你需要将chorme更新到最新版版本84,下载对应的chorme驱动 链接:http://chromedriver.storage.googleapis.com/index.html 注意 划重点!!一定要做这一步,因为我用的83的chorme他是不行滴,~~~~~~~ 问题 1.一周前我的滑块验证代码还是可以OK的,完全没问题!附代码 low一眼 url = "https://login.taobao.com/member/login.jhtml&quo

  • Vue集成阿里云做滑块验证的实践

    目录 前言 集成阿里云验证 前端需要什么 引入阿里云验证 封装一个验证组件 使用组件 思考 前言 滑块验证是比较常见的人机鉴别手段,但是自己做一时半会还真搞不出来,想想这玩意还挺难琢磨,怎么识别是否是人机呢?本文介绍Vue+阿里云验证做出这个小功能. 集成阿里云验证 前端需要什么 appkey scene 后端配合 引入阿里云验证 public/index.html <head>   <script src="https://g.alicdn.com/AWSC/AWSC/aws

  • JavaScript实现拼图式滑块验证功能

    目录 演示 前戏 源码介绍 主页样式设计 滑块验证部分 img_ver内部 演示 前戏 滑块验证码是在网站.APP等应用中常见的一种验证方式,通过按照一定规则滑动滑块到指定位置完成验证,才可以进行下一步操作.滑块验证码有两种设计,一种是在滑动框内“一滑到底”即完成验证的,还有一种是滑动滑块拼合拼图完成验证的.由于拼图式的滑块验证码安全性更高,趣味性更强,所以多数网站或APP都选择了拼图式的滑块验证码. 拼图式的滑块验证码在业务应用中有三种展现形式,触发式.嵌入式和弹出式.触发式即鼠标光标移入验证

随机推荐