#Python #密碼管理器 無需再記住密碼,使用Python實現個人密碼管理器

来源:https://www.cnblogs.com/pyublog/archive/2023/02/09/17105402.html
-Advertisement-
Play Games

​本文在CSDN"彭_Yu的博客"同步發表 目錄 1.要點 2.運行原理 3.異或演算法簡介 4.運行效果 5.實現過程 5.1文件結構 5.2建立資料庫 5.3 Python代碼 ​ 編輯 註:程式實例可到文末下載 1.要點 1.tkinter界面設計 2.SQLite資料庫操作 3.字元串異或運算 ...


​本文在CSDN"彭_Yu的博客"同步發表

 目錄

1.要點

2.運行原理

3.異或演算法簡介         

4.運行效果 

5.實現過程 

5.1文件結構

5.2建立資料庫

5.3 Python代碼 


編輯

註:程式實例可到文末下載 

1.要點

 

1.tkinter界面設計

2.SQLite資料庫操作

3.字元串異或運算加密和解密

2.運行原理

1.用戶需要記住一個統一的加解密密鑰,對於各平臺的密碼,使用密鑰字元串異或運算加密後存儲到資料庫,查詢時使用同一個密鑰進行密鑰字元串異或解密。

2.需要註意的是,由於代碼採用的是異或演算法,所以密碼字元串和密鑰字元串不應有對應位置上相同的字元。

3.由於代碼採用的是異或演算法所以並不安全,他人猜到的加解密密鑰與正確密鑰越相似,解密出的密碼也就與正確密碼越相似。你可以改寫加密和解密演算法,實現更高級別的密碼保護。

3.異或演算法簡介         

       XOR 是 exclusive OR 的縮寫。英語的 exclusive 意思是"專有的,獨有的",可以理解為 XOR 是更單純的 OR 運算。

  我們知道,OR 運算的運運算元有兩種情況,計算結果為true

(1)一個為 true,另一個為 false;
(2)兩個都為 true。

       上面兩種情況,有時候需要明確區分,所以引入了 XOR。

       XOR 排除了第二種情況,只有第一種情況(一個運運算元為true,另一個為false)才會返回 true,所以可以看成是更單純的 OR 運算。也就是說, XOR 主要用來判斷兩個值是否不同。

       XOR 一般使用插入符號(caret)^表示。如果約定0 為 false,1 為 true,那麼 XOR 的運算真值表如下。

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

4.運行效果 

運行效果
編輯

5.實現過程 

5.1文件結構

/根目錄
-MyPWD.exe(主程式)
-MyPWD.sqlite3(資料庫文件)

5.2建立資料庫

       在這裡我們可以使用線上sqlite查看器:

線上sqlite查看器

       輸入如下信息:

CREATE TABLE passwords (platform TEXT, pwd TEXT, id INTEGER PRIMARY KEY)

 

輸入信息
編輯

         單擊執行 sql>導出Sqlite資料庫文件  並將文件重命名為 “MyPWD.sqlite3”  放入MyPWD.exe(主程式)所在目錄。

單擊執行 sql>導出Sqlite資料庫文件
編輯
將文件重命名為 “MyPWD.sqlite3”  放入MyPWD.exe(主程式)所在目錄
編輯

5.3 Python代碼 

import sqlite3
import tkinter
from itertools import cycle
from tkinter.ttk import Combobox
from tkinter.messagebox import showinfo, showerror, askyesno
class DatabaseAccess:
    @staticmethod
    def doSql(sql):
        with sqlite3.connect('MyPWD.sqlite3') as conn:
            conn.execute(sql)
            conn.commit()
            
    @staticmethod
    def getData(sql):
        with sqlite3.connect('MyPWD.sqlite3') as conn:
            cur = conn.cursor()
            cur.execute(sql)
            return cur.fetchall()
root = tkinter.Tk()
root.geometry('350x250+400+300')
root.resizable(False, False)
root.title('(C)2022彭_Yu')
lbKey = tkinter.Label(root, text='密碼資料庫密鑰:')
lbKey.place(x=10, y=10, width=100, height=20)
key = tkinter.StringVar(root, '')
entryKey = tkinter.Entry(root, textvariable=key, show='*')
entryKey.place(x=120, y=10, width=200, height=20)
lbPlatform = tkinter.Label(root, text='平臺  名稱:')
lbPlatform.place(x=10, y=40, width=100, height=20)
platformName = tkinter.StringVar(root, '')
entryPlatform = tkinter.Entry(root, textvariable=platformName)
entryPlatform.place(x=120, y=40, width=200, height=20)
lbPassword = tkinter.Label(root, text='設置  密碼:')
lbPassword.place(x=10, y=70, width=100, height=20)
password = tkinter.StringVar(root, '')
entryPassword = tkinter.Entry(root, textvariable=password)
entryPassword.place(x=120, y=70, width=200, height=20)
def add_modify():
    if not (key.get() and platformName.get() and password.get()):
        showerror('出錯',
                  '請同時輸入密碼資料庫密鑰、平臺名稱、密碼.\n註意:密鑰不要隨意更改.')
        return
    if key.get().isdigit():
        showerror('密鑰安全性出錯', '為了您的密鑰安全,不能使用純數字作為密鑰')
        return
    if sum(map(lambda x,y: x==y, password.get(), key.get())) > 0:
        showerror('密鑰安全性出錯', '密碼不合適,為了您的密鑰安全,密碼和密鑰不能有對應位置相同的字元')
        return
    pwd = ''.join(map(lambda x,y: chr(ord(x)^ord(y)), password.get(), cycle(key.get())))
    sql = 'SELECT * FROM passwords WHERE platform="'+platformName.get()+'"'
    if len(DatabaseAccess.getData(sql)) == 1:
        sql = 'UPDATE passwords SET pwd="'+pwd+'" WHERE platform="'+platformName.get()+'"'
        DatabaseAccess.doSql(sql)
        showinfo('恭喜請求執行成功', '修改密碼成功')
    else:
        sql = 'INSERT INTO passwords(platform,pwd) VALUES("'+platformName.get()+'","'+pwd+'")'
        DatabaseAccess.doSql(sql)
        bindPlatformNames()
        showinfo('恭喜請求執行成功', '增加密碼成功')
btnAddModify = tkinter.Button(root,
                              text='增加或修改密碼',
                              bg='cyan',
                              fg='black',
                              command=add_modify)
btnAddModify.place(x=20, y=100, width=300, height=20)
lbChoosePlatform = tkinter.Label(root, text='請選擇平臺:')
lbChoosePlatform.place(x=10, y=130, width=100, height=20)
def bindPlatformNames():
    sql = 'SELECT platform FROM passwords'
    data = DatabaseAccess.getData(sql)
    data = [item[0] for item in data]
    comboPlatform['values'] = data
comboPlatform = Combobox(root)
bindPlatformNames()
comboPlatform.place(x=120, y=130, width=200, height=20)

lbResult = tkinter.Label(root, text='查詢  結果:')
lbResult.place(x=10, y=160, width=100, height=20)
result = tkinter.StringVar(root, '')
entryResult = tkinter.Entry(root, textvariable=result)
entryResult['state'] = 'disabled'
entryResult.place(x=120, y=160, width=200,height=20)
def getPassword():
    if not comboPlatform.get().strip():
        showerror('出錯', '還沒選擇平臺名稱')
        return
    if not key.get():
        showerror('出錯', '請輸入密鑰')
        return
    sql = 'SELECT pwd FROM passwords WHERE platform="'+comboPlatform.get()+'"'
    pwd = DatabaseAccess.getData(sql)[0][0]
    pwd = ''.join(map(lambda x,y: chr(ord(x)^ord(y)), pwd, cycle(key.get())))
    result.set(pwd)
btnGetResult = tkinter.Button(root,
                              text='查詢密碼',
                              bg='cyan',
                              fg='black',
                              command=getPassword)
btnGetResult.place(x=20, y=190, width=149, height=20)
def deletePassword():
    if not comboPlatform.get().strip():
        showerror('出錯', '您還沒選擇平臺名稱')
        return
    if not askyesno('請確認您的請求', '確定要刪除嗎?刪除後不可恢復!'):
        return
    sql = 'DELETE FROM passwords WHERE platform="'+comboPlatform.get()+'"'
    DatabaseAccess.doSql(sql)
    showinfo('恭喜操作成功完成', '密碼刪除成功')
    bindPlatformNames()
btnDelete = tkinter.Button(root, text='刪除密碼',
                           bg='red', fg='yellow',
                           command=deletePassword)
btnDelete.place(x=179, y=190, width=140, height=20)
root.mainloop()

        然後將此程式編譯為exe,當然不編譯也可以但要保證 MyPWD.py 文件與 MyPWD.sqlite3 資料庫文件在同一目錄下。

        關於如何編譯請查看我以前的一篇文章,做好準備操作但不要執行其中的編譯命令,而是執行以下命令(執行前請保證目錄結構與以下圖片對應)。

#Python #日常技巧 #功能 將Python文件編譯或打包成可執行(EXE)文件_python編譯成可執行文件_彭_Yu的博客-CSDN博客#Python #日常技巧 #功能 將Python文件編譯或打包成可執行(EXE)文件。將Python文件編譯為exe文件後,可以直接在Windows上運行,不需要再依賴Python環境,可以複製到其他電腦中直接使用,較為方便。 https://blog.csdn.net/2201_75480799/article/details/128058849

         做好準備操作後,執行如下代碼:

cd X:\源代碼
pyinstaller -F -w -i X:\源代碼\icon.ico X:\源代碼\MyPWD.py
目錄結構
目錄結構
編輯

           出現如下字元說明編譯成功,請將根目錄中 dist 文件夾中的MyPWD.exe(主程式)放入 “MyPWD.sqlite3” 所在目錄。

編譯成功
編輯

          預祝使用順利~

文章資源下載:

https://pan.baidu.com/s/1cW8kRcQFOF2tBBj05UZmZg

提取碼:2xr7 

         感謝您的閱讀,如覺得有用請您點贊,您的鼓勵是對我的最大動力!

  END 

2022/12/24

聯繫我:[email protected]

本文作者:彭_Yu
轉載請先聯繫[email protected]並註明原文鏈接:https://www.cnblogs.com/pyublog/p/17105402.html否則為侵權行為!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 教程簡介 人工智慧與Python初學者教程 - 通過簡單易學的步驟學習人工智慧從基礎到高級概念,包括入門概念,入門,機器學習,數據準備,監督學習:分類,監督學習:回歸,邏輯編程,無監督學習:聚類,性能考慮,自然語言處理,NLTK包,分析時間序列數據,語音識別,啟髮式搜索,游戲,神經網路,強化學習,遺 ...
  • Rust 語言由 Mozilla 開發,最早發佈於 2014 年 9 月,是一種高效、可靠的通用高級語言。其高效不僅限於開發效率,它的執行效率也是令人稱贊的,是一種少有的兼顧開發效率和執行效率的語言。 ...
  • Python裝飾器實例講解(二) Python裝飾器實例講解(一) 你最好去看下第一篇,雖然也不是緊密的鏈接在一起 參考B站碼農高天的視頻,大家喜歡看視頻可以跳轉忽略本文:https://www.bilibili.com/video/BV19U4y1d79C 一鍵三連哦 本文的知識點主要是 ​ 類裝 ...
  • Mybatis 作為國內開發中常用到的半自動 orm 框架,相信大家都很熟悉,它提供了簡單靈活的xml映射配置,方便開發人員編寫簡單、複雜SQL,在國內互聯網公司使用眾多。 本文針對筆者日常開發中對 Mybatis 占位符 #{} 和 ${} 使用時機結合源碼,思考總結而來 Mybatis 版本 3 ...
  • 安裝Rust 參考文檔,指定安裝目錄和鏡像配置。 rustc --version 檢查是否安裝成功。 構建程式 使用rustc編譯運行 rustc 編譯:rustc main.js 運行: Windows:.\main.exe 或 main Linux:./main 註意: 編譯成功後會生成一個二進 ...
  • java中線程的實現方式 繼承Thread類 代碼 : package ThreadImplamen; import static java.lang.Thread.sleep; public class threadImp { public static void main(String[] ar ...
  • Maven 用的好好的,gradle這個程咬金冒出來了! 沒法子,咱們乾! Gradle 目錄結構: 各文件作用 build.gradle | 相當於maven的pom,主要定義依賴文件,編譯版本等信息 gradlew | Linux下的shell腳本,內部調用的是本項目中的gradle 目錄下的g ...
  • 教程簡介 初學者敏捷數據科學教程 - 從簡單和簡單的步驟開始學習敏捷數據科學,包括簡介,方法概念,數據科學過程,敏捷工具和安裝,敏捷數據處理,SQL與NoSQL,NoSQL和數據流編程,收集和顯示,數據可視化,數據豐富,使用報告,預測的作用,使用PySpark提取功能,構建回歸模型,部署預測系統,S ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...