数据不经加密你能放心,那用户呢?在这里提供一下我使用的加密函数,加密以后只有数字和字母,而且加密结果唯一,支持设置密钥,破解难度嘛,我没试过,你们可以试试(然后我好加固),欢迎你的采用
加密
function jiami($data, $secretKey) {
// 验证输入
if (empty($data) || empty($secretKey)) {
throw new InvalidArgumentException('密钥为空或加密内容为空');
}
// 生成固定长度的密钥派生值 (32字节用于AES-256)
$derivedKey = hash('sha256', $secretKey, true);
// 生成固定IV (基于密钥派生)
$iv = substr(hash('sha256', 'fixed_iv_salt_' . $secretKey), 0, 16);
// 使用AES-256-CBC加密
$encrypted = openssl_encrypt(
$data,
'aes-256-cbc',
$derivedKey,
OPENSSL_RAW_DATA,
$iv
);
// 转换为十六进制字符串(仅含字母数字)
return bin2hex($encrypted);
}
解密
function jiemi($encryptedData, $secretKey) {
// 验证输入
if (empty($encryptedData) || empty($secretKey)) {
throw new InvalidArgumentException('密钥为空或加密内容为空');
}
// 检查是否为有效十六进制
if (!ctype_xdigit($encryptedData)) {
throw new InvalidArgumentException('加密数据格式无效');
}
// 生成与加密相同的密钥派生值
$derivedKey = hash('sha256', $secretKey, true);
// 生成相同的固定IV
$iv = substr(hash('sha256', 'fixed_iv_salt_' . $secretKey), 0, 16);
// 十六进制转二进制
$decoded = hex2bin($encryptedData);
if ($decoded === false) {
throw new RuntimeException('十六进制转换失败');
}
// 解密数据
return openssl_decrypt(
$decoded,
'aes-256-cbc',
$derivedKey,
OPENSSL_RAW_DATA,
$iv
);
}
使用实例就是
$secretKey = 'key';//密钥,用于解密
$originalData = '123abcde';//加密内容
加密
$encrypted = jiami($originalData, $secretKey);
echo "Encrypted: " . $encrypted . "\n"; // 输出纯十六进制字符串
解密
$decrypted = jiemi($encrypted, $secretKey);
echo "Decrypted: " . $decrypted . "\n";
道高一尺魔高一丈,没有永远解不开的密码,只有不断尝试的人
可能TA的心是你永远解不开的