<?
/**
* Simple and easy secure encrypted unique signature
*
* Basically this algorithm provides a unique signature for a specific visitor
*
* @requirements PHP 5.x
* PEAR Crypt HMAC2 <http://pear.php.net/package/Crypt_HMAC2>
* PEAR Net User Agent <http://pear.php.net/package/Net_UserAgent_Detect/>
* @usage
* require_once 'class.signature.php';
* $sign = new signature();
* $signature = $sign->create();
*
* @category Cryptography
* @package Safe_Signature
* @author Lopo Lencastre de Almeida, iPublicis - Internet Agency, Portugal <http://www.ipublicis.com>
* @license http://opensource.org/licenses/lgpl-3.0.html GNU Lesser General Public License v3
* @version $Id: class.signature.php,v 1.0 2008/11/25 12:12:09 humaneasy Exp $
* @link http://www.phpclasses.org/safe_signature
* @donations http://smsh.me/7kit
**/
class signature {
/**
* Convert hexadecimal value to a Base64 string
*
* This method converts any given hexadecimal string to the corresponding Base64 string
*
* @access private
* @param string Hexadecimal string
* @return string Base64 string
**/
protected function _hex2b64 ($str)
{
$raw = '';
for ($i=0; $i < strlen($str); $i+=2)
{
$raw .= chr(hexdec(substr($str, $i, 2)));
}
return base64_encode($raw);
}
/**
* Create CRC16 value
*
* Returns CRC16 of a string as int value. Used internaly.
*
* @access private
* @param string Input string
* @return string CRC16 int
**/
protected function _crc16($string) {
$crc = 0xFFFF;
for ($x = 0; $x < strlen ($string); $x++) {
$crc = $crc ^ ord($string[$x]);
for ($y = 0; $y < 8; $y++) {
if (($crc & 0x0001) == 0x0001) {
$crc = (($crc >> 1) ^ 0xA001);
} else {
$crc = $crc >> 1;
}
}
}
return $crc;
}
/**
* Create the signature
*
* Method used for signature generation
*
* @access public
* @param none
* @return string Encoded encrypted signature
*/
public function create()
{
$ip_address = $_SERVER['REMOTE_ADDR'];
$browser = serialize(array('browser' => Net_UserAgent_Detect::_getStaticProperty('browser'),
'features' => Net_UserAgent_Detect::_getStaticProperty('features'),
'leadingIdentifier' => Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier'),
'majorVersion' => Net_UserAgent_Detect::_getStaticProperty('majorVersion'),
'options' => Net_UserAgent_Detect::_getStaticProperty('options'),
'os' => Net_UserAgent_Detect::_getStaticProperty('os'),
'quirks' => Net_UserAgent_Detect::_getStaticProperty('quirks'),
'subVersion' => Net_UserAgent_Detect::_getStaticProperty('subVersion'),
'userAgent' => Net_UserAgent_Detect::_getStaticProperty('userAgent'),
'version' => Net_UserAgent_Detect::_getStaticProperty('version'),
));
$nonce = $this->_crc16($browser);
$secretKey = md5($this->_crc16($ip_address));
$strToSign = $ip_address . "\n" . $browser . "\n" . $nonce;
$hasher = new Crypt_HMAC2($secretKey, "sha256");
return urlencode ($this->_hex2b64($hasher->hash($strToSign)));
}
}
?>
|