You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何安全存储邮件发送程序源码中的邮箱密码?

嘿,这个问题我太熟了——硬编码密码绝对是安全开发的红线,必须改掉!下面给你几个实用的方案,既能把密码藏得好好的,又能保证调用Mail API时拿到原始值:

方案1:用环境变量(最简单的入门方案)

直接把密码存在系统/服务器的环境变量里,代码运行时读取就行,完全不会出现在源码里。

比如在Linux/macOS终端里设置:

export EMAIL_PASSWORD="你的真实密码"

Windows的话可以在系统属性里添加环境变量,或者用命令行:

setx EMAIL_PASSWORD "你的真实密码"

然后代码里这样写:

// 从环境变量读取密码,再也不用硬编码啦
String emailPassword = System.getenv("EMAIL_PASSWORD");
Mail sender = new Mail("sourceEmailID", emailPassword);
sender.sendMail("Subject","Body","sourceEmailID", "destinationEmailID");

这个方案的好处是简单粗暴,不同环境(开发、测试、生产)可以设置不同密码,而且密码不会被提交到Git这类版本控制工具里。

方案2:加密配置文件(适合需要集中管理配置的场景)

如果你的项目习惯用配置文件(比如.properties.yml),可以把密码加密后存在配置文件里,代码启动时再解密。推荐用Jasypt这个工具,上手很简单。

首先在配置文件里存加密后的密码:

# application.properties
email.id=sourceEmailID
email.password=ENC(这里放你加密后的密码字符串)

然后代码里解密并使用:

import org.jasypt.util.text.StandardPBEStringEncryptor;
import java.util.Properties;

public class MailApp {
    public static void main(String[] args) {
        // 初始化加密器,密钥别硬编码!可以存在环境变量里
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword(System.getenv("JASYPT_ENCRYPTION_KEY"));

        // 读取配置文件
        Properties properties = new Properties();
        properties.load(MailApp.class.getClassLoader().getResourceAsStream("application.properties"));

        // 解密密码
        String encryptedPassword = properties.getProperty("email.password");
        String decryptedPassword = encryptor.decrypt(encryptedPassword.replace("ENC(", "").replace(")", ""));

        // 调用Mail API
        Mail sender = new Mail(properties.getProperty("email.id"), decryptedPassword);
        sender.sendMail("Subject","Body","sourceEmailID", "destinationEmailID");
    }
}

这样就算配置文件不小心泄露,别人也拿不到真实密码,密钥单独存在环境变量里,双重保障。

方案3:密钥管理服务(生产环境首选)

如果是企业级生产环境,强烈用专业的密钥管理服务(KMS),比如AWS KMS、Azure Key Vault,或者本地的HashiCorp Vault。把密码存在KMS里,代码通过API获取解密后的密码,安全性拉满。

举个AWS KMS的例子:

import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.DecryptRequest;
import java.nio.ByteBuffer;
import java.util.Base64;

public class MailApp {
    public static void main(String[] args) {
        AWSKMS kmsClient = AWSKMSClientBuilder.defaultClient();

        // 从KMS解密密码(这里的CiphertextBlob是你存在KMS里的加密数据)
        String encryptedPasswordBlob = "你的加密密码Blob";
        DecryptRequest decryptRequest = new DecryptRequest()
                .withCiphertextBlob(ByteBuffer.wrap(Base64.getDecoder().decode(encryptedPasswordBlob)));
        String emailPassword = new String(kmsClient.decrypt(decryptRequest).getPlaintext().array());

        Mail sender = new Mail("sourceEmailID", emailPassword);
        sender.sendMail("Subject","Body","sourceEmailID", "destinationEmailID");
    }
}

KMS会帮你管密钥的生命周期、访问权限,还能留审计日志,完全符合生产环境的安全要求。

额外提醒
  • 不管用哪种方案,绝对不要把密码(哪怕是加密后的)提交到Git,记得把配置文件加到.gitignore里!
  • 别在日志里打印密码,哪怕打星号也要小心,防止日志泄露。
  • 如果是桌面应用,可以用系统自带的安全存储:Windows的Credential Manager、macOS的Keychain、Linux的libsecret,密码存在系统的安全容器里,更靠谱。

内容的提问来源于stack exchange,提问作者Neha Beniwal

火山引擎 最新活动