Y32579 2024-03-31 18:16 采纳率: 0%
浏览 9
已结题

通过非对称加密保存配置文件

现在项目中有一个配置文件,其中包含数据库密码
现在想通过密钥a加密后存储到git仓库中,然后部署到服务器的时候服务器通过密钥b+密码解密并使用

  1. 有什么方法可以实现这种需求。
  2. 我知道的是Windows上可以通过ssh-keygen -t rsa可以给私钥设置密码。这种机制能不能实现我的需求呢,可以的话该如何操作呢(用C++或Python给出一种实现当然更好)。

img

  • 写回答

7条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    要实现你的需求,可以使用非对称加密算法(如RSA)对配置文件中的数据库密码进行加密,并将加密后的文件存储在git仓库中。服务器在部署时,使用相应的私钥进行解密,并读取配置文件中的数据库密码进行使用。

    以下是一种实现方式:

    1. 生成密钥对:

      • 使用ssh-keygen命令生成密钥对,其中公钥将用于加密配置文件,私钥将用于解密配置文件。在命令行终端中,运行以下命令:

        ssh-keygen -t rsa
        
        • 按照提示输入文件路径,可以使用默认路径(如:C:\Users\username\.ssh\id_rsa)。
        • 为私钥设置密码,此密码将用于解密文件,请记住这个密码。
        • 生成的密钥对将保存在指定的文件路径中。
    2. 加密配置文件:

      • 在代码中使用公钥对配置文件中的数据库密码进行加密。可以使用Python的cryptography库或C++的Crypto++库等工具来实现非对称加密。以下是一个用Python的示例代码:
    from cryptography.hazmat.primitives.asymmetric import rsa, padding
    from cryptography.hazmat.primitives import serialization, hashes
    
    def encrypt(password, public_key_path):
        with open(public_key_path, "rb") as key_file:
            public_key = serialization.load_pem_public_key(
                key_file.read(),
                backend=default_backend()
            )
        encrypted_data = public_key.encrypt(
            password.encode(),
            padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None
            )
        )
        return encrypted_data
    
    password = "your_password"
    public_key_path = "path_to_public_key"
    encrypted_data = encrypt(password, public_key_path)
    # 将encrypted_data保存到配置文件中
    
    1. 解密配置文件:
      • 在服务器代码中使用私钥对加密后的配置文件进行解密。以下是一个用Python的示例代码:
    from cryptography.hazmat.primitives.asymmetric import rsa, padding
    from cryptography.hazmat.primitives import serialization, hashes
    
    def decrypt(encrypted_data, private_key_path, private_key_password):
        with open(private_key_path, "rb") as key_file:
            private_key = serialization.load_pem_private_key(
                key_file.read(),
                password=private_key_password.encode(),
                backend=default_backend()
            )
            
        password = private_key.decrypt(
            encrypted_data,
            padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None
            )
        )
        return password.decode()
    
    encrypted_data = # 从配置文件读取加密数据
    private_key_path = "path_to_private_key"
    private_key_password = "your_private_key_password"
    password = decrypt(encrypted_data, private_key_path, private_key_password)
    # 使用解密后的password进行数据库连接等操作
    

    请注意,在实际部署环境中,私钥文件和密码应该妥善保管,不应该直接存储在代码中或公开共享

    这种方法可以实现对配置文件中敏感信息的安全保存和传输,但请注意在使用非对称加密时,加密文件的大小会增加,可能会对性能产生影响

    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月31日
  • 创建了问题 3月31日

悬赏问题

  • ¥15 请教下, VS QT 环境下, QTOPCUA 的源文件报错,这种情况咋查呢 ?
  • ¥20 UNITY webgl关于文档的上传和下载问题
  • ¥15 安霸cv22 + rtl8211f 千兆,udp传输丢包
  • ¥15 关于区块链和边缘环境搭建的相关问题
  • ¥15 windows远程桌面断卡重连软件卡顿问题
  • ¥30 Unity 实现扫描效果
  • ¥15 HbuilderX检测不到安卓模拟器
  • ¥15 这个main已经在filename.obj中定义是什么错 C语言
  • ¥15 关于#linux#的问题:exsi8.0系统 怎么更改web访问端口,不用80、443
  • ¥15 使用elementor设计样式