You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP在数据库安全存储可解密的用户API登录凭据?

解决方案:基于用户WebApp密码的API凭据加密存储

核心思路是用用户的WebApp密码通过**密钥派生函数(KDF)**生成对称加密密钥,再用这个密钥加密API的用户名和密码。即使数据库泄露,攻击者没有用户的WebApp密码,也无法解密出有效的API凭据。

关键步骤与PHP实现

1. 绑定API凭据时的加密流程

当用户首次输入API账号密码并绑定到WebApp账号时,执行以下操作:

// 1. 生成随机盐(用于密钥派生)和IV(用于AES加密)
$salt = random_bytes(16);
$iv = random_bytes(openssl_cipher_iv_length('aes-256-gcm'));

// 2. 从用户的WebApp密码派生加密密钥(用Argon2id,PHP 7.2+支持)
$encryptionKey = sodium_crypto_pwhash(
    SODIUM_CRYPTO_PWHASH_KEYBYTES,
    $userWebAppPassword, // 用户登录WebApp的明文密码
    $salt,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

// 3. 拼接API凭据为JSON(方便加密存储)
$apiCredentials = json_encode([
    'username' => $userApiUsername,
    'password' => $userApiPassword
]);

// 4. 用AES-256-GCM加密API凭据,同时生成认证标签
$encryptedCredentials = openssl_encrypt(
    $apiCredentials,
    'aes-256-gcm',
    $encryptionKey,
    OPENSSL_RAW_DATA,
    $iv,
    $tag
);

// 5. 将以下内容存入数据库(关联WebApp用户ID)
// - base64_encode($encryptedCredentials)
// - base64_encode($salt)
// - base64_encode($iv)
// - base64_encode($tag)

2. 用户登录后的解密流程

用户登录WebApp后,需要调用API时,从数据库取出存储的加密数据,用用户输入的密码重新派生密钥并解密:

// 1. 从数据库取出对应用户的存储数据
$encryptedCredentials = base64_decode($dbStoredEncrypted);
$salt = base64_decode($dbStoredSalt);
$iv = base64_decode($dbStoredIv);
$tag = base64_decode($dbStoredTag);

// 2. 用用户输入的WebApp密码重新派生密钥
$encryptionKey = sodium_crypto_pwhash(
    SODIUM_CRYPTO_PWHASH_KEYBYTES,
    $userInputWebAppPassword,
    $salt,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

// 3. 解密API凭据并验证标签(防止篡改)
$decrypted = openssl_decrypt(
    $encryptedCredentials,
    'aes-256-gcm',
    $encryptionKey,
    OPENSSL_RAW_DATA,
    $iv,
    $tag
);

if (!$decrypted) {
    // 解密失败:密码错误或数据被篡改,终止操作
    die('Invalid credentials or tampered data');
}

// 4. 解析出API账号密码,调用接口
$apiCreds = json_decode($decrypted, true);
// 调用API:$apiCreds['username'], $apiCreds['password']

安全注意事项

  • 绝不存储派生的加密密钥:密钥只在内存中生成和使用,用完后立即销毁(可以用sodium_memzero($encryptionKey))。
  • 使用强KDF算法:优先选Argon2id(PHP的sodium_crypto_pwhash),比PBKDF2更抗暴力破解。
  • AES-GCM模式:自带认证标签,能检测数据是否被篡改,避免攻击者替换加密内容。
  • 随机盐和IV:每次加密都用新的随机值,避免相同密码加密出相同的密文。
  • 避免明文传递:用户输入API凭据和WebApp密码时,必须用HTTPS传输,防止中间人窃取。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:44