python3 MD5加密用法

我们做登录的时候都不是明文处理不安全,所以推荐MD5的用法,以后再更新其他的加密方法

首先现安装包

pip install hashlib

1.第一种方法,密码定死不能改的形式

import hashlib
str_md5 = hashlib.md5(b'123456').hexdigest()
print('MD5加密后为 :' + str(str_md5).upper())

MD5括号中就是定死的形式,
2.第二种可以修改形式,比较常用

import hashlib
str = '123456'
# 创建md5对象
m = hashlib.md5()
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
# b = str.encode(encoding='utf-8')
b = bytes(str, encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()
str_md5 = str_md5.upper()
print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)

仅供参考。

Python 3下AES加密的常用方法

** 第一步,安装crypto**
pip install crypto
** 第二步,安装pycryptodome**
pip install pycryptodome
第三步,改文件夹名称
进入Python3的目录下的\lib\site-packages,将crypto文件夹更名为Crypto(注意是大写的C,否则导入模块失败

import base64
from Crypto.Cipher import AES

import base64
from Crypto.Cipher import AES


# AES加密
def aes_crypt(key, iv, passwd):
    """
    AES加密算法(key,iv,passwd输入均应为bytes类型,选择MODE_CBC类型加密)
    :param key: 秘钥(定值,16位长度)
    :param iv: 偏移(定值,位长度)
    :param passwd: 密码
    :return: 返回值再经过base64加密后
    """
    BS = AES.block_size  # 获取AES数据位数(16位)
    # 补位,补够16位
    pad = (lambda s: s + (BS - len(s) % BS) * '#')
    print(pad(passwd))
    aes = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
    return base64.b64encode(aes.encrypt(pad(passwd).encode('utf-8')))


aes_key = 'QYFfyuDHGUIbplmn'
aes_iv = '1111115642223454'
password = '123456'
# 注意,经过aes_crypt加密的密文是bytes类型
password = aes_crypt(aes_key, aes_iv, password).decode('utf-8')
print(password)

url加密
我们访问网址时系统会将我们的输入的文字进入url加密,如

http://www.baidu.com/s?wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91

那么‘%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91’到底是什么呢?
解密
首先导入from urllib import parse

粘贴代码操作下就知道了

from urllib import parse
from urllib import request


url = 'http://www.baidu.com/s?'
dict1 ={'wd': '百度翻译'}
url_data = parse.urlencode(dict1) #unlencode()将字典{k1:v1,k2:v2}转化为k1=v1&k2=v2
print(url_data)             #url_data:wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91
data = request.urlopen((url+url_data)).read() #读取url响应结果
data = data.decode('utf-8') #将响应结果用utf8编码
with open('1.html', 'w', encoding='utf-8')as f:
    f.write(data)
# print(data)
url_org = parse.unquote(url_data) #解码url
print(url_org)   

查看资料看到可以自己写加密与君共享

def encrypt(s):
    b = bytearray(str(s).encode("gbk"))
    n = len(b)  # 求出 b 的字节数
    c = bytearray(n * 2)
    j = 0
    for i in range(0, n):
        b1 = b[i]
        b2 = b1 ^ n  # b1 = b2^ key
        c1 = b2 % 16
        c2 = b2 // 16  # b2 = c2*16 + c1
        c1 = c1 + 65
        c2 = c2 + 65  # c1,c2都是0~15之间的数,加上65就变成了A-P 的字符的编码
        c[j] = c1
        c[j + 1] = c2
        j = j + 2
    return c.decode("utf8")


def decrypt(s):
    c = bytearray(str(s).encode("utf8"))
    n = len(c)  # 计算 b 的字节数
    if n % 2 != 0:
        return ""
    n = n // 2
    b = bytearray(n)
    j = 0
    for i in range(0, n):
        c1 = c[j]
        c2 = c[j + 1]
        j = j + 2
        c1 = c1 - 65
        c2 = c2 - 65
        b2 = c2 * 16 + c1
        b1 = b2 ^ n
        b[i] = b1
    try:
        return b.decode("gbk")
    except:
        return "failed"

s1 = encrypt('123456')
s2 = decrypt(s1)

s1是加密结果
s2是解密
完美 (ಥ_ಥ)

<think>好的,我现在需要解决用户关于Nacos GRPC客户端在请求流完成时切换服务器出现的错误的问题。首先,我需要理解用户的问题场景。用户在使用NacosGRPC客户端时,当请求流(stream)完成时,尝试切换服务器,但遇到了错误。这可能导致连接中断、请求失败或其他异常情况。 接下来,我应该回顾NacosGRPC通信模块结构。根据引用[1],Nacos的客户端RpcClient不仅定义了接口,还实现了消息发送、服务器切换等功能。GrpcClient负责实际的连接和消息处理。服务器切换可能涉及到重新建立连接、处理未完成的请求以及维护状态一致性。 可能的错误原因包括: 1. **连接状态不一致**:在流关闭(onCompleted)后,客户端可能未正确更新连接状态,导致切换时状态混乱。 2. **资源未释放**:流资源如网络连接或缓冲区未正确释放,导致新连接无法建立。 3. **异步处理问题**:GRPC的异步特性可能导致切换时出现竞态条件,例如在切换过程中仍有未完成的请求。 4. **服务器端处理异常**:新服务器可能未正确处理来自客户端的重连请求,或者配置不一致。 针对这些可能性,我需要逐步提出解决方案。首先,确保在调用onCompleted后正确关闭流并释放资源。其次,实现重连机制时检查连接状态,避免重复切换。同时,需要处理异步请求,确保切换前完成或取消所有未完成的操作。此外,服务器端的配置和兼容性也需要验证。 可能还需要参考现有的分布式系统设计模式,比如引用[3]提到的服务网格和分布式追踪系统,来确保客户端切换时的可观测性和错误排查。例如,使用Jaeger或Zipkin来跟踪请求流,识别切换过程中的问题节点。 最后,生成的相关问题需要涵盖性能优化、异常处理机制、日志调试方法以及与K8s集成的注意事项,帮助用户全面理解和解决问题。</think>### Nacos GRPC客户端请求流完成时切换服务器错误解决方案 #### 1. 问题定位与分析 根据引用[1],Nacos客户端通过`RpcClient`管理GRPC连接,`GrpcClient`负责具体通信。**请求流完成时切换服务器的错误**通常由以下原因导致: - **连接状态未同步**:流关闭后,客户端状态未及时更新,导致切换时触发无效操作。 - **资源泄漏**:未正确释放GRPC流占用的网络资源,新连接无法绑定端口。 - **异步回调冲突**:切换过程中存在未完成的异步请求,与新连接产生竞争。 #### 2. 具体解决步骤 **步骤1:确保流关闭与资源释放** 在调用`onCompleted()`后,需显式关闭流并释放资源: ```java stream.onCompleted(() -> { stream.close(); // 显式关闭流 releaseNetworkResources(); // 释放网络资源 }); ``` **步骤2:同步服务器切换状态** 在`RpcClient`中增加状态检查,避免重复切换: ```java public void switchServer() { if (currentStatus != Status.CLOSED) { throw new IllegalStateException("必须先关闭当前连接"); } // 执行服务器切换逻辑 } ``` **步骤3:处理异步请求残留** 通过`CompletableFuture`跟踪未完成请求,切换前强制取消: ```java List<CompletableFuture<?>> pendingRequests = getPendingRequests(); pendingRequests.forEach(future -> future.cancel(true)); // 取消所有未完成操作 ``` **步骤4:配置重试策略** 在`GrpcClient`中添加指数退避重试: ```java RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 30000, 3); // 基础间隔1s,最大30s,最多3次 retryPolicy.execute(this::reconnectToNewServer); ``` #### 3. 关键验证点 - **日志追踪**:启用DEBUG级别日志,确认`onCompleted`后触发的所有回调完成。 - **连接池监控**:使用类似引用[3]的分布式追踪工具(如Jaeger)验证连接生命周期。 - **服务器兼容性**:检查新旧服务器Nacos版本是否一致(如2.1.0+需强制TLS)。 #### 4. 高级优化建议 - **服务网格集成**:通过Istio等工具管理GRPC连接,自动处理服务器切换[^3]。 - **健康检查增强**:在`RpcClient`中实现主动健康检查,提前标记不可用节点。 - **熔断机制**:使用Hystrix或Resilience4j避免频繁切换导致的雪崩效应。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值