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

寻求支持0-255全字符集的存储方案及标准双向加密函数

问题分析与解决方案

一、字符丢失(黑菱形问号)问题

原因

  1. 字符集与存储逻辑冲突:你生成的字符包含0-31(控制字符)、127(DEL)、128-160(扩展ASCII),这些字符在latin1字符集中虽有定义,但多数环境会将控制字符视为无效内容进行替换。旧主机环境未对这类字符做过滤,直接按原始字节存储;而cPanel环境默认的PHP/MySQL字符集配置(比如强制UTF-8连接)会尝试将无法映射到目标字符集的字符替换为�(不可逆替换字符)。
  2. 仅改字段排序规则无效:排序规则(如latin1_swedish_ci)仅影响数据排序逻辑,无法解决PHP与MySQL通信时的字符集转换问题——若连接字符集设为UTF-8,系统会自动转译你的扩展ASCII/控制字符,转译失败就会生成�。

恢复与解决方法

  1. 数据恢复(依赖备份):如果旧主机有完整数据备份,直接恢复到新主机后调整配置;若无备份,已变成�的数据无法还原,因为替换字符是不可逆的。
  2. 修改存储类型:将存储加密内容的字段改为BINARY/VARBINARY或BLOB类型——这些类型按原始字节存储,不做任何字符集转换,完美适配控制字符与扩展ASCII。
  3. 强制MySQL连接字符集:PHP连接MySQL时,设置连接字符集为binary,避免自动转译:
    // mysqli示例
    mysqli_set_charset($conn, 'binary');
    // PDO示例
    $pdo = new PDO('mysql:host=xxx;dbname=xxx;charset=binary', $user, $pass);
    
  4. 统一PHP文件字符集:在PHP文件开头添加字符集声明,确保操作逻辑一致:
    header('Content-Type: text/html; charset=latin1');
    

二、密码管理器的标准双向加密方案

自定义的ASCII逐位相加属于弱加密,极易被破解,推荐使用PHP内置的OpenSSL对称加密函数,这是行业标准的双向加密方案,支持AES等安全算法:

核心函数

  • openssl_encrypt():加密明文
  • openssl_decrypt():解密密文

示例实现(AES-256-GCM模式,带认证防篡改)

// 从用户输入的密钥派生安全密钥(PBKDF2算法增强安全性)
function deriveKey($userKey, $salt) {
    return hash_pbkdf2('sha256', $userKey, $salt, 10000, 32, true);
}

// 加密函数
function encryptData($plaintext, $userKey) {
    $salt = random_bytes(16); // 随机盐,需随密文存储
    $key = deriveKey($userKey, $salt);
    $iv = random_bytes(12); // GCM模式推荐12字节IV
    $tag = ''; // 认证标签,需随密文存储
    $ciphertext = openssl_encrypt(
        $plaintext,
        'aes-256-gcm',
        $key,
        OPENSSL_RAW_DATA,
        $iv,
        $tag
    );
    // 打包盐、IV、标签、密文,base64编码方便存储
    return base64_encode($salt . $iv . $tag . $ciphertext);
}

// 解密函数
function decryptData($encryptedData, $userKey) {
    $data = base64_decode($encryptedData);
    $salt = substr($data, 0, 16);
    $iv = substr($data, 16, 12);
    $tag = substr($data, 28, 16);
    $ciphertext = substr($data, 44);
    $key = deriveKey($userKey, $salt);
    return openssl_decrypt(
        $ciphertext,
        'aes-256-gcm',
        $key,
        OPENSSL_RAW_DATA,
        $iv,
        $tag
    );
}

注意事项

  • 每次加密使用随机生成的盐和IV,避免相同明文生成重复密文;
  • 盐、IV、认证标签必须随密文一起存储,解密时缺一不可;
  • 需引导用户设置高强度密钥(至少8位,含大小写/数字/符号),可在前端做强度校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:35:30