前段时间写过一个数据库暴力破解的工具,使用了一个28G的大字典,最后还是以失败告终。当然这个也是自己写着娱乐的。并没有发布出来。通过测试来看,破解数据库密码还是有一定难度的。但是大家千万不要使用弱密码,比如下面的几种:
在设计密码模式时建议大家在程序上强制要求用户满足强密码模式,可以参考以下几种:
下面说一下mysql连接工具的设计和实现吧!
设计
MySQL在连接时要求用户提供主机地址、端口号、数据库名、用户名、密码等条件。我们就以这些信息为模型,设计出表单和提交按钮。
我们使用python的第三方库 tkinter 来实现UI界面。最终实现效果如下:
数据库连接
我们知道程序在运行过程中出现错误会停止运行,如果我们输入了错误的密码,那么程序将自行跳出,停止运行,所以在这里我们需要使用try-except来执行代码。
try:
except:
这种模式在执行代码时会执行try下的代码,如果代码出现异常则执行except下的代码,跳出try模式。如果没有异常则会直接忽略掉except下的代码,继续向下执行。
想学习python的同学,可以看一看下面的这本书,目前我这里有这本书的电子版,可以联系我获取。
代码
通过UI界面获取到我们输入的数据库配置信息,在后台对数据进行校验。将校验结果返回至前台,这里我使用的是tkinter中的 messagebox 进行弹窗提示,代码如下。
tkinter.messagebox.showinfo('提示信息', '请输入完整数据')
程序打包
目前已经将程序使用pyinstaller进行打包,有需要的可以找我。
代码
# -*-coding:UTF-8 -*-
import tkinter
import tkinter.messagebox
import pymysql
import time
win = tkinter.Tk()
# 设置标题
win.title('Mysql测试连接')
# 设置位置和大小
win.geometry("400x400+704+304")
# 描述性文字
tkinter.Label(win, text='主机地址', font=('Helvetica Neue', 12)).place(x=10, y=10)
tkinter.Label(win, text='端口号', font=('Helvetica Neue', 12)).place(x=10, y=50)
tkinter.Label(win, text='数据库', font=('Helvetica Neue', 12)).place(x=10, y=90)
tkinter.Label(win, text='用户名', font=('Helvetica Neue', 12)).place(x=10, y=130)
tkinter.Label(win, text='密码', font=('Helvetica Neue', 12)).place(x=10, y=170)
# 主机
host_default = tkinter.StringVar()
host_default.set('127.0.0.1')
host = tkinter.Entry(win, textvariable=host_default, font=('Helvetica Neue', 14))
host.place(x=120, y=10)
# 端口号
port_default = tkinter.StringVar()
port_default.set('3306')
port = tkinter.Entry(win, textvariable=port_default, font=('Helvetica Neue', 14))
port.place(x=120, y=50)
# 数据库名
database_default = tkinter.StringVar()
# database_default.set()
database = tkinter.Entry(win, textvariable=database_default, font=('Helvetica Neue', 14))
database.place(x=120, y=90)
# 用户名
name_default = tkinter.StringVar()
# name_default.set()
name = tkinter.Entry(win, textvariable=name_default, font=('Helvetica Neue', 14))
name.place(x=120, y=130)
# 密码
password_default = tkinter.StringVar()
# password_default.set()
password = tkinter.Entry(win, textvariable=password_default, font=('Helvetica Neue', 14))
password.place(x=120, y=170)
# 计算及下一步操作
def button_call_back():
# 获取输入框内的数据
host = host_default.get()
port = port_default.get()
database = database_default.get()
name = name_default.get()
password = password_default.get()
if (host and port) and (database and name):
# 破解
res = find_pass(host, port, database, name, password)
if res:
tkinter.messagebox.showinfo('提示信息', '连接成功')
else:
tkinter.messagebox.showinfo('提示信息', '连接失败')
else:
tkinter.messagebox.showinfo('提示信息', '请输入完整数据')
# 数据库连接测试
def find_pass(host, port, database, name, password):
try:
con = pymysql.connect(
# 数据库地址
host='%s' % host,
# 端口
port=int(port),
# 用户名
user='%s' % name,
# 密码
password='%s' % password,
# 数据库名称
database='%s' % database,
# 编码设置
charset='utf8'
)
con.close()
return password # 连接成功返回 密码
except:
return False
# 按钮
submit = tkinter.Button(win, text="开始", bg="#005ca9", fg="#FFF", width=20, height=1, command=button_call_back)
submit.place(x=130, y=300)
# 进入消息循环
win.mainloop()