在php中,我想加密和解密数据。我不想使用特殊字符。我只有 6-8 位数字与字母和数字。对于加密和解密,我已经制作了此功能,但有时它无法解密加密的数字,也无法解密其长度与特殊字符。
function random_password($length = 8) {
$password = "";
$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
$maxlength = strlen($possible);
if ($length > $maxlength) {
$length = $maxlength;
}
$i = 0;
while ($i < $length) {
$char = substr($possible, mt_rand(0, $maxlength-1), 1);
if (!strstr($password, $char)) {
$password .= $char;
$i++;
}
}
return $password;
}
function encrypt($plaintext, $salt) {
$td = mcrypt_module_open('cast-256', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $salt, $iv);
$encrypted_data = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$encoded_64 = base64_encode($encrypted_data);
return trim($encoded_64);
}
function decrypt($crypttext, $salt) {
$decoded_64=base64_decode($crypttext);
$td = mcrypt_module_open('cast-256', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $salt, $iv);
$decrypted_data = mdecrypt_generic($td, $decoded_64);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return trim($decrypted_data);
}
我有两个陈述,然后是很多问题。
- 您编写的加密代码不安全,因此请勿使用它。并请告知您发现该代码的任何地方,他们正在分发不安全的加密代码。
- 我的意思是,欧洲央行模式下的 CAST-256...用静脉注射?并使用
MCRYPT_RAND
?而且完全未经身份验证?没有安全专家会签署这一点。
- 我的意思是,欧洲央行模式下的 CAST-256...用静脉注射?并使用
- 在名为
random_password()
的函数中使用mt_rand()
也令人担忧。您没有使用 CSPRNG。
你到底要什么?
我不想使用特殊字符。我只有 6-8 位数字与字母和数字。
所以,您希望输出大小在 6-8 位(为什么这个变量?)之间,只有字母数字字符?
2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ
为什么没有元音?
你想在这里解决什么问题?
你为什么不直接使用化解/php加密,并使用你想要的任何密码呢?或者完全避开密码并使用其基于密钥的加密功能(默认)?
我建议使用安全的PHP加密库,而不是编写自己的加密库。
并且请务必告知您的消息来源他们发布的加密代码中的安全错误。使用该代码的人越少,互联网就越安全。