Golang+Python 實現安全動態開機密碼+服務器存儲
作者 | 李秋鍵
出品 | AI科技大本營(ID:rgznai100)
引言:
如果談到近幾年來新起的語言,必然離不開Python語言和Go語言,正如python在人工智能領域的發展火熱,Go語言在服務器并發處理也有著非常優勢。
Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發布。Go 是非常年輕的一門語言,它的主要目標是“兼具 Python 等動態語言的開發速度和 C/c++ 等編譯型語言的性能與安全性”。Go語言是編程語言設計的又一次嘗試,是對類C語言的重大改進,它不但能讓你訪問底層操作系統,還提供了強大的網絡編程和并發編程支持。Go語言的用途眾多,可以進行網絡編程、系統編程、并發編程、分布式編程。
其中Go語言的特點主要集中在以下幾個方面:1、語法簡單;2、并發模型;3、內存分配;4、垃圾回收;5、靜態鏈接;6、標準庫;7、工具鏈。并且在Google、Facebook、騰訊、百度、七牛云、京東、小米、360等大廠公司都有所使用。除了上面提到的,還有很多公司開始嘗試使用Go語言,比如美團、滴滴、新浪等。Go語言的強項在于它適合用來開發網絡并發方面的服務,比如消息推送、監控、容器等,所以在高并發的項目上大多數公司會優先選擇 Golang 作為開發語言。
而今天我們就將使用Go語言+python語言實現一個動態開機密碼的功能。其中python在這里用來設置動態密碼,Go語言負責服務器存儲和數據傳輸響應。
整體程序結構如下可見:

Python修改密碼程序介紹
按照自己設定的規則進行每天動態修改密碼,可以提高電腦的安全性。這里我們同時還需要借助一個bat批處理程序來獲取管理員權限才能達到修改密碼的目的。
導入庫介紹:
(1)subproces庫:subprocess模塊允許你去創建一個新的進程讓其執行另外的程序,并與它進行通信,獲取標準的輸入、標準輸出、標準錯誤以及返回碼等。
(2)getpass庫:getpass模塊提供了平臺無關的在命令行下輸入密碼的方法; 該模塊主要提供:兩個函數: getuser, getpass;一個報警: GetPassWarning(當輸入的密碼可能會顯示的時候拋出,該報警為UserWarning的一個子類)
1.1 密碼修改
在這里我們設定密碼規則為每天的日期+一個特定的數,獲取月日信息,為了防止規則過于簡單,我們將日期這個參數設為:當前日期+反轉其中。比如1028轉為8201。此時參數為10288201,然后加上我們特定的數,比如是20200202。
其中獲取日期代碼如下:
import time
temp=time.strftime('%m%d',time.localtime(time.time()))
反轉日期代碼如下:
def reverse(s):
ans=""
while len(s)!=0:
ans+=s.pop(-1)
return ans
修改密碼代碼如下:
import subprocess
import getpass
pivot=20200202
temp=temp+reverse(list(temp))
result=str(int(pivot)+int(temp))+"l"
psd = result
user = getpass.getuser() #獲取計算機用戶名
print(user)
f=open("password.txt","w")
f.write(result)
f.close()
s=subprocess.Popen(['net', 'User', user, psd])
print("success")即設定的密碼如下:

1.2 批處理獲取管理員權限
建立 password.bat 程序,通過使用cmd命令獲取管理員:
@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)
cd /d "%~dp0"
start python test.pyGo語言端
所使用的模塊介紹:
(1)net包:net包提供了可移植的網絡I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。此包提供了對網絡原語的訪問,大部分使用者只需要Dial、Listen和Accept函數提供的基本接口;以及相關的Conn和Listener接口。crypto/tls包提供了相同的接口和類似的Dial和Listen函數。使用Dial函數和服務端建立連接;Listen函數創建的服務端。
(2)log包:log包實現了簡單的日志記錄,它定義了Logger類型,其中包含格式化輸出的方法。它還有一個預定義的“標準”Logger,可以通過輔助函數Print[f|ln],Fatal[f|ln]和Panic[f|ln]訪問,它們比手動創建Logger更容易使用(Logger你可以理解為"日志記錄器")。該記錄器寫入標準錯誤(stderr)并打印每個記錄消息的日期和時間。每條日志消息都在單獨的行中輸出:如果正在打印的消息未以換行符結尾,則記錄器將添加一條消息。Fatal函數在寫入日志消息后調用os.Exit(1), Panic函數在寫入日志消息后調用panic。
(3)os包:os包提供了與平臺無關的操作系統功能接口。
2.1 client客戶端
1、首先是通過批處理文件獲取管理員權限并調用python以實現修改密碼的功能,并將密碼存儲在password.txt文本中。
代碼如下:
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}2、讀取password存儲的密碼,并發送到服務器。
代碼如下:
f, err := os.OpenFile("password.txt", os.O_RDONLY, 0600)
defer f.Close()
if err != nil {
fmt.Println(err.Error())
} else {
contentByte,err0:=ioutil.ReadAll(f)
print(err0)
words := string(contentByte)
conn.Write([]byte(words))
fmt.Println("send over") }
3、設置發送的服務器地址和其對應的端口,建立TCP連接。
代碼如下:
server := "服務器地址:端口"
tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
fmt.Println("connect success")
sender(conn)
2.2 server.go 服務器接收端
接收端的程序需要放置服務器上,建立監聽的端口,接收client發送的數據包,并存儲為txt文件:
1、建立socket監聽端口,代碼如下:
netListen, err := net.Listen("tcp", "0.0.0.0:5006")
CheckError(err)
defer netListen.Close()//注冊延遲調用函數,netlisten調用完才會執行close
//首先清除txt
del := os.Remove("password.txt");
if del != nil {
fmt.Println(del);
}
Log("Waiting for clients")
for {
conn, err := netListen.Accept()
if err != nil {
continue
}
Log(conn.RemoteAddr().String(), " tcp connect success")//log顯示連接成功
handleConnection(conn)
}2、處理連接,獲取數據包并存儲到 password.txt 文件中:
buffer := make([]byte, 2048)//建立緩存區
for {
n, err := conn.Read(buffer)
if err != nil {
Log(conn.RemoteAddr().String(), " connection error: ", err)
return
}
Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))
//接收到的數據寫入txt中
f, err := os.OpenFile("password.txt", os.O_APPEND|os.O_CREATE, 0600)
defer f.Close()
if err != nil {
fmt.Println(err.Error())
} else {
_,err=f.Write([]byte(string(buffer[:n])+" \n"))
//checkErr(err)
}
}
完整代碼:
鏈接:https://pan.baidu.com/s/1OSQXQ4D_cSXDBf3r7aQuIw
提取碼:8vrd
李秋鍵,CSDN博客專家,CSDN達人課作者。碩士在讀于中國礦業大學,開發有taptap競賽獲獎等。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。







