WHMCS 密码加密方式

2015年8月10日 分类: PHP (745 个脚步)

今天闲来没事,看了一遍 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 密码加密方式 【声明】本文 WHMCS 密码加密方式 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2015/08/whmcs-password-encrypt-decrypt/ , 转载请保留本声明!

标签: , , ,
2 条评论
你必须要启用 Javascript