首页
/ Sanic项目中RSA加密解密路径问题的分析与解决

Sanic项目中RSA加密解密路径问题的分析与解决

2025-05-12 14:28:34作者:农烁颖Land

背景介绍

在Python Web开发中,Sanic是一个高性能的异步Web框架。在实际开发过程中,我们经常需要处理敏感数据如用户密码的加密存储。RSA非对称加密算法因其安全性高而被广泛使用,但在实际应用中可能会遇到一些意想不到的问题。

问题现象

开发者在Sanic项目中实现了一个RSA加密解密类RSAJiamiJiemi,用于处理用户密码的加密和解密。该类的功能包括:

  1. 检查密钥文件是否存在
  2. 生成新的RSA密钥对(如果不存在)
  3. 读取密钥文件内容
  4. 提供加密和解密方法

在单独测试时,加密解密功能工作正常。但当集成到Sanic服务中运行时,解密功能却返回空结果,而加密结果与单独测试时相同。

问题分析

通过仔细检查代码,发现问题出在文件路径的处理上。代码中使用了相对路径../密钥/来定位密钥文件:

public_key_file = "public_key.pem"
private_key_file = "private_key.pem"
parent_file = "密钥"

# 问题代码
self.public_key = self.read_file(f"../{self.parent_file}/{self.public_key_file}")

这种相对路径的写法在不同运行环境下会产生不同的结果:

  1. 单独运行脚本时:相对路径是基于脚本所在目录解析的
  2. 在Sanic服务中运行时:相对路径是基于服务启动目录解析的

解决方案

针对这类路径问题,有以下几种可靠的解决方案:

方案一:使用绝对路径

最直接的方法是使用绝对路径来定位密钥文件:

import os

# 获取当前脚本所在目录
base_dir = os.path.dirname(os.path.abspath(__file__))
key_dir = os.path.join(base_dir, "密钥")

public_key_path = os.path.join(key_dir, "public_key.pem")
private_key_path = os.path.join(key_dir, "private_key.pem")

方案二:使用配置文件

将路径配置放在配置文件中,便于管理和修改:

# config.py
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
KEY_DIR = os.path.join(BASE_DIR, "密钥")

# 在加密类中
from config import KEY_DIR

public_key_path = os.path.join(KEY_DIR, "public_key.pem")

方案三:使用环境变量

对于不同部署环境,可以使用环境变量指定密钥路径:

import os

key_dir = os.getenv("KEY_DIR", os.path.join(os.path.dirname(__file__), "密钥"))

最佳实践建议

  1. 避免使用相对路径:特别是在生产环境中,相对路径容易导致不可预期的问题
  2. 统一路径处理方式:项目中应该统一使用一种路径处理方式(如绝对路径)
  3. 考虑多环境部署:开发、测试和生产环境可能有不同的目录结构
  4. 错误处理:增加对文件不存在等异常情况的处理
  5. 日志记录:记录密钥加载过程,便于排查问题

代码优化示例

以下是优化后的代码片段:

import os
from pathlib import Path

class RSAJiamiJiemi:
    def __init__(self):
        # 获取当前文件所在目录的绝对路径
        base_dir = Path(__file__).parent.absolute()
        key_dir = base_dir / "密钥"
        
        # 确保密钥目录存在
        key_dir.mkdir(exist_ok=True)
        
        self.public_key_path = key_dir / "public_key.pem"
        self.private_key_path = key_dir / "private_key.pem"
        
        if not self.public_key_path.exists():
            self._generate_and_save_keys()
            
        self.public_key = self.public_key_path.read_bytes()
        self.private_key = self.private_key_path.read_bytes()
        
    def _generate_and_save_keys(self):
        rsa_key = RSA.generate(2048)
        self.public_key_path.write_bytes(rsa_key.public_key().export_key())
        self.private_key_path.write_bytes(rsa_key.export_key())

总结

在Sanic项目或其他Python项目中处理文件路径时,必须注意运行环境的差异。相对路径虽然编写简单,但在不同运行环境下可能导致问题。使用绝对路径、Path对象或配置文件可以避免这类问题,提高代码的可靠性和可维护性。对于安全相关的密钥文件,更应该确保路径处理的准确性,避免因路径问题导致的安全隐患。

登录后查看全文
热门项目推荐