WHMCS 密码加密方式
今天闲来没事,看了一遍 WHMCS 在网上流传的代码。
网上找到的只有 5.2.17 版本的,不过对于我们用来研究代码的人,也足够了。
他所使用的加密方式不是传统的 MD5 + 盐 的方式实现。
加密后的数据只会出现一次,但每一个密码解出来的密码都是一样的,类似于 openssl 的加密方式。
然后就是硬通货时间:
先定义一个加密的专用随机字符串,这个要保密,泄密的后果是很严重的哦。
然后使用 encrypt 来加密就可以了。
$cc_encryption_hash = 'blog.shiniv.com';
echo encrypt('shiniv.com');
#>
zehWlOMNLObmltJ3rTUeBDzuOd50NLH/UaX9pBmr
解密同理,只要知道秘钥跟加密后的字符串就能得到加密前的内容
$cc_encryption_hash = 'blog.shiniv.com';
echo decrypt("zehWlOMNLObmltJ3rTUeBDzuOd50NLH/UaX9pBmr");
#>
shiniv.com
相关的函数如下:
function encrypt($string) {
global $cc_encryption_hash;
$key = md5(md5($cc_encryption_hash)) . md5($cc_encryption_hash);
$hash_key = _hash($key);
$hash_length = strlen($hash_key);
$iv = _generate_iv();
$out = "";
$c = 0;
while ($c < $hash_length) {
$out .= chr(ord($iv[$c]) ^ ord($hash_key[$c]));
++$c;
}
$key = $iv;
$c = 0;
while ($c < strlen($string)) {
if ($c != 0 && $c % $hash_length == 0) {
$key = _hash($key . substr($string, $c - $hash_length, $hash_length));
}
$out .= chr(ord($key[$c % $hash_length]) ^ ord($string[$c]));
++$c;
}
$out = base64_encode($out);
return $out;
}
function decrypt($string) {
global $cc_encryption_hash;
$key = md5(md5($cc_encryption_hash)) . md5($cc_encryption_hash);
$hash_key = _hash($key);
$hash_length = strlen($hash_key);
$string = base64_decode($string);
$tmp_iv = substr($string, 0, $hash_length);
$string = substr($string, $hash_length, strlen($string) - $hash_length);
$iv = $out = "";
$c = 0;
while ($c < $hash_length) {
$iv .= chr(ord($tmp_iv[$c]) ^ ord($hash_key[$c]));
++$c;
}
$key = $iv;
$c = 0;
while ($c < strlen($string)) {
if ($c != 0 && $c % $hash_length == 0) {
$key = _hash($key . substr($out, $c - $hash_length, $hash_length));
}
$out .= chr(ord($key[$c % $hash_length]) ^ ord($string[$c]));
++$c;
}
return $out;
}
function _hash($string) {
if (function_exists("sha1")) {
$hash = sha1($string);
}
else {
$hash = md5($string);
}
$out = "";
$c = 0;
while ($c < strlen($hash)) {
$out .= chr(hexdec($hash[$c] . $hash[$c + 1]));
$c += 2;
}
return $out;
}
function _generate_iv() {
global $cc_encryption_hash;
srand((double)microtime() * 1000000);
$iv = md5(strrev(substr($cc_encryption_hash, 13)) . substr($cc_encryption_hash, 0, 13));
$iv .= rand(0, getrandmax());
$iv .= serialize(array("key" => md5(md5($cc_encryption_hash)) . md5($cc_encryption_hash)));
return _hash($iv);
}
【声明】本文 WHMCS 密码加密方式 为柠之漠然原创文章,转载请注明出自
枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2015/08/whmcs-password-encrypt-decrypt/ , 转载请保留本声明!
马克了,吸收下