資源簡介
一次性口令身份認證:口令表里存放了用戶名、N次MD5加密的口令、應戰值N、隨機數R;用戶登錄輸入賬號口令認證,認證成功即更新口令和N;N=1時即重置隨機數。

代碼片段和文件信息
#!/usr/bin/env?python3.7
#?-*-?coding:?utf-8?-*-
import?hashlib
import?random
def?user_exist(username):#檢測用戶是否存在
????“““
????檢查用戶是否已經存在
????:param?username:?用戶名
????:return:?True,則用戶名已經存在;False,用戶名不存在
????“““
????with?open(‘db‘‘r+‘encoding=“utf-8“)?as?f:
????????for?line?in?f:
????????????line?=?line.strip()
????????????line_list?=?line.split(“|“)
????????????if?username?==?line_list[0]:
????????????????return?True
????????f.close()
????return?False
def?log(user?pwd):??#?登陸時候時候的函數,由于md5不能反解,因此登陸的時候用正解
????with?open(‘db‘?‘r‘?encoding=‘utf-8‘)?as?f:
????????for?line?in?f:#一行一行的讀取
????????????line_list?=?line.strip().split(‘|‘)
????????????ran?=?findran(user)
????????????N?=?int(findN(user))-1
????????????pwd1?=?pwd?+?ran
????????????p1?=?MDme(pwd1N)
????????????if?user?==?line_list[0]?and?line_list[1]?==?md5(p1):?#?登陸的時候驗證用戶名以及加密的密碼跟之前保存的是否一樣
????????????????N?=?str(N)
????????????????update(userp1N)
????????????????return?True
????????f.close()
def?register(user?pwd?ran):??#?注冊的時候把用戶名和加密的密碼寫進文件,保存起來
????with?open(‘db‘?‘a+‘?encoding=‘utf-8‘)?as?f:
????????N=10
????????pwd?=?pwd+ran
????????temp?=?user?+?‘|‘?+?MDme(pwdN)?+?‘|‘?+?‘10‘?+??‘|‘?+?ran?+??‘\n‘
????????f.write(temp)
????????f.close()
????return?True
def?md5(arg):??#?這是加密函數,將傳進來的參數進行md5加密
????md5_pwd?=?hashlib.md5()?#創建一個MD5對象
????md5_pwd.update(arg.encode(encoding=‘utf-8‘))
????#?這里必須用encode()函數對字符串進行編碼,不然會報?TypeError:?Unicode-objects?must?be?encoded?before?hashing
????return?md5_pwd.hexdigest()??#?返回加密的數據
def?MDme(textn):#MD5循環N次加密
????while?n>=1:
????????for?i?in?range(n):#進行N次循環
????????????md5?=?hashlib.md5()
????????????md5.update(text.encode(encoding=‘UTF-8‘))
????????????md5_result?=?md5.hexdigest()
????????????text?=?md5_result
????????????n?=?n?-?1
????return?md5_result#返回加密完的結果
def?findran(user):#找隨機數
????with?open(‘db‘?‘r‘?encoding=‘utf-8‘)?as?f:#打開db文件,并賦予只讀權限,并用utf-8進行編碼,并用f作為該文件的簡稱
????????for?line?in?f:#逐行讀取文件
????????????line_list?=?line.strip().split(‘|‘)#去掉文本中每行開頭與結尾的符號的(回車符),并以|為分隔符分開存入line_list列表中
????????????if?user?==?line_list[0]:#如果傳入的參數user在列表第一列有,則返回第三列的N
????????????????f.close()
????????????????return?line_list[3]
????????f.close()
def?findN(user):#找N
????with?open(‘db‘?‘r‘?encoding=‘utf-8‘)?as?f:
????????for?line?in?f:
????????????line_list?=?line.strip().split(‘|‘)
????????????if?user?==?line_list[0]:
????????????????f.close()
????????????????return?line_list[2]
????????f.close()
????????????
def?changePass(userpwdN):
????with?open(‘db‘‘r‘encoding=‘utf-8‘)?as?f:
????????for?line?in?f:
????????????line_list?=?line.strip().split(‘|‘)
????????????ran?=?findran(user)
????????????pwd1?=?pwd?+?ran
????????????p1?=?MDme(pwd1int(N))
????????????update(userp1N)
????????f.close()
def?changeran(usernameN):#改變隨機數
????with?open(“db“?“r“)?as?f:
????????lines?=?f.readlines()
????????for?lin?in?f.readlines():
????????????if?lin!=‘\n‘:
??????????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5658??2019-05-07?13:08??一次性口令身份認證.py
?????文件??????????0??2019-05-07?13:09??db
-----------?---------??----------?-----??----
?????????????????5658????????????????????2
評論
共有 條評論