python - 尝试发送使用 PBKDF2 散列的数据时 Python 程序崩溃
问题描述
我正在尝试使我的登录系统安全,并且我正在使用 PBKDF2 散列算法。但是每次我启动我的程序并尝试向服务器发送一些东西时,它都会因一些奇怪的错误而崩溃Process finished with exit code -1073740791 (0xC0000409)
这是 Send_login 函数的代码:
try:
tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect((host_ip, server_port))
tcp_client.sendall(('L|' + str(pbkdf2.crypt(Login.encode(), iterations=150, salt="f597beecd1f5be49cce44b7b62316669")) + '|' + str(pbkdf2.crypt(Pass.encode(), iterations=150, salt="f597beecd1f5be49cce44b7b62316669"))))
received = tcp_client.recv(2048)
received = received.decode("utf8")
if received == "Auth succeed":
print("Credentials are correct")
else:
print("Either credentials are incorrect or our servers are unavailable right now")
finally:
tcp_client.close()
PS:Send_login() 是唯一与此套接字交互的函数
解决方案
首先,如果您是 Web 应用程序,请使用 SSL。其次,如果您仍想加密消息,请使用加密模块。
import ujson as json
import base64, zlib
from config import config_opts
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
SALT = config_opts['SALT']
SALT_SIZE = config_opts['SALT_SIZE']
SALT_OFF_SET = config_opts['SALT_OFF_SET']
NUMBER_OF_ITERATIONS = config_opts['NUMBER_OF_ITERATIONS']
AES_MULTIPLE = config_opts['AES_MULTIPLE']
def cryptkey(password=''):
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
digest.update(SALT+password)
return Fernet(base64.urlsafe_b64encode(digest.finalize()))
def encrypt(meta, password=''):
meta = json.dumps(meta)
meta = str(zlib.compress(meta, 9))
f = cryptkey(password)
return base64.urlsafe_b64encode(f.encrypt(bytes(meta)))
def decrypt(meta, password=''):
meta = base64.urlsafe_b64decode(meta)
f = cryptkey(password)
meta = f.decrypt(bytes(meta))
meta = zlib.decompress(meta)
return json.loads(meta)
try:
tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect((host_ip, server_port))
tcp_client.sendall(encrypt([Login.encode(), Pass.encode()]))
received = tcp_client.recv(2048)
received = received.decode("utf8")
if received == "Auth succeed":
print("Credentials are correct")
else:
print("Either credentials are incorrect or our servers are unavailable right now")
finally:
tcp_client.close()
然后你的后端应该使用decrypt
函数(和可选密码)。Base64 使其更适合 REST api 通信。
推荐阅读
- python - 确定文件是“更可能”是 json 还是 csv
- javascript - 如何在 Flask 应用程序中使用 Polymer 元素作为静态资源?
- java - 我是否需要自动化扫描 QR 的应用程序,是否有 Appium 功能可以从 JAVA 发送特定的 QR?
- vue.js - 修复了 vue js 中带有动态内容的侧边栏
- linux - Linux Find 命令——根据文件名排除查找
- javascript - 如何动态重新加载部分文档
- r - 如何根据 TOOL 列中的不同值在 ITEM 上使用多个分隔符?
- apache-nifi - 将json文件拆分为多个流文件
- excel - Excel 正在引用我的文件的另一个版本。我怎样才能让它引用自己呢?
- python - Numpy 的结构化数组与 xarray(xray)有什么区别?