X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=framework%2Fmain%2Fclasses%2Fcrypto%2Fclass_CryptoHelper.php;fp=framework%2Fmain%2Fclasses%2Fcrypto%2Fclass_CryptoHelper.php;h=153f4d4f781daacb89c535f6cf5b73e8db031ff2;hb=78a010fef84895720e796842208f01dfb619c332;hp=0000000000000000000000000000000000000000;hpb=7629f2314d517561d4301ddfb068a797b6ed8700;p=core.git diff --git a/framework/main/classes/crypto/class_CryptoHelper.php b/framework/main/classes/crypto/class_CryptoHelper.php new file mode 100644 index 00000000..153f4d4f --- /dev/null +++ b/framework/main/classes/crypto/class_CryptoHelper.php @@ -0,0 +1,239 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +class CryptoHelper extends BaseFrameworkSystem implements Cryptable { + // Exception constants + const EXCEPTION_ENCRYPT_MISSING = 0x1f0; + const EXCEPTION_ENCRYPT_INVALID = 0x1f1; + + /** + * An instance of this own clas + */ + private static $selfInstance = NULL; + + /** + * Instance of the crypto stream + */ + private $cryptoStreamInstance = NULL; + + /** + * Salt for hashing operations + */ + private $salt = ''; + + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of this class + * + * @return $cryptoInstance An instance of this crypto helper class + */ + public static final function createCryptoHelper () { + // Get a new instance + $cryptoInstance = new CryptoHelper(); + + // Initialize the hasher + $cryptoInstance->initHasher(); + + // Attach a crypto stream + $cryptoInstance->attachCryptoStream(); + + // Return the instance + return $cryptoInstance; + } + + /** + * Get a singleton instance of this class + * + * @return $selfInstance An instance of this crypto helper class + */ + public static final function getSelfInstance () { + // Is no instance there? + if (is_null(self::$selfInstance)) { + // Then get a new one + self::$selfInstance = self::createCryptoHelper(); + } // END - if + + // Return the instance + return self::$selfInstance; + } + + /** + * Attaches a crypto stream to this crypto helper by detecting loaded + * modules. + * + * @return void + */ + protected function attachCryptoStream () { + // Do we have mcrypt loaded? + if ($this->isPhpExtensionLoaded('mcrypt')) { + // Then use it + $this->cryptoStreamInstance = ObjectFactory::createObjectByName('McryptStream', array($this->getRngInstance())); + } else { + // If nothing works ... + $this->cryptoStreamInstance = ObjectFactory::createObjectByName('NullCryptoStream'); + } + } + + /** + * Initializes the hasher for different purposes. + * + * @return void + */ + protected function initHasher () { + // Initialize the random number generator which is required by some crypto methods + $this->setRngInstance(ObjectFactory::createObjectByConfiguredName('rng_class')); + + // Generate a salt for the hasher + $this->generateSalt(); + } + + /** + * Generates the salt based on configured length + * + * @return void + */ + private function generateSalt () { + // Get a random string from the RNG + $randomString = $this->getRngInstance()->randomString() . $this->createUuid(); + + // Get config entry for salt length + $length = $this->getConfigInstance()->getConfigEntry('salt_length'); + + // Keep only defined number of characters + $this->salt = substr(sha1($randomString), -$length, $length); + } + + /** + * Returns a UUID (Universal Unique IDentifier) if PECL extension uuid was + * found or an empty string it not. + * + * @return $uuid UUID with leading dash or empty string + */ + public function createUuid () { + // Init empty UUID + $uuid = ''; + + // Is the UUID extension loaded and enabled? (see pecl) + if ($this->getConfigInstance()->getConfigEntry('extension_uuid_loaded') === TRUE) { + // Then add it as well + $uuid = uuid_create(); + } // END - if + + // Return it + return $uuid; + } + + /** + * Hashes a string with salt and returns the hash. If an old previous hash + * is supplied the method will use the first X chars of that hash for hashing + * the password. This is useful if you want to check if password is identical + * for authorization purposes. + * + * @param $str Unhashed string + * @param $oldHash A hash from previous hashed string + * @param $withFixed Whether to include a fixed salt (not recommended in p2p applications) + * @return $hashed The hashed and salted string + */ + public function hashString ($str, $oldHash = '', $withFixed = TRUE) { + // Cast the string + $str = (string) $str; + + // Default is the default salt ;-) + $salt = $this->salt; + + // Is the old password set? + if (!empty($oldHash)) { + // Use the salt from hash, first get length + $length = $this->getConfigInstance()->getConfigEntry('salt_length'); + + // Then extract the X first characters from the hash as our salt + $salt = substr($oldHash, 0, $length); + } // END - if + + // Hash the password with salt + //* DEBUG: */ echo "salt=".$salt."/plain=".$str."
\n"; + if ($withFixed === TRUE) { + // Use additional fixed salt + $hashed = $salt . md5(sprintf($this->getConfigInstance()->getConfigEntry('hash_extra_mask'), + $salt, + $this->getRngInstance()->getFixedSalt(), + $str + )); + } else { + // Use salt+string to hash + $hashed = $salt . md5(sprintf($this->getConfigInstance()->getConfigEntry('hash_normal_mask'), + $salt, + $str + )); + } + + // And return it + return $hashed; + } + + /** + * Encrypt the string with fixed salt + * + * @param $str The unencrypted string + * @param $key Optional key, if none provided, a random key will be generated + * @return $encrypted Encrypted string + */ + public function encryptString ($str, $key = NULL) { + // Encrypt the string through the stream + $encrypted = $this->cryptoStreamInstance->encryptStream($str, $key); + + // Return the string + return $encrypted; + } + + /** + * Decrypt the string with fixed salt + * + * @param $encrypted Encrypted string + * @return $str The unencrypted string + */ + public function decryptString ($encrypted) { + // Encrypt the string through the stream + $str = $this->cryptoStreamInstance->decryptStream($encrypted); + + // Return the string + return $str; + } + +}