101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\passwd;
 | |
| 
 | |
| use nur\b\IllegalAccessException;
 | |
| 
 | |
| /**
 | |
|  * Class passwords; outils pour gérer les mots de passe
 | |
|  */
 | |
| class passwords {
 | |
|   /** obtenir le salt d'un mot de passe hashé en CRYPT */
 | |
|   static function get_des_crypt_salt(string $crypt): string {
 | |
|     return substr($crypt, 0, 2);
 | |
|   }
 | |
| 
 | |
|   static function des_crypt(string $clear, ?string $salt=null): string {
 | |
|     if ($salt === null) $salt = "AA";
 | |
|     return crypt($clear, $salt);
 | |
|   }
 | |
| 
 | |
|   static function sha(string $clear): string {
 | |
|     return base64_encode(sha1($clear, true));
 | |
|   }
 | |
| 
 | |
|   static function xsha(string $clear): string {
 | |
|     return strtoupper(sha1($clear));
 | |
|   }
 | |
| 
 | |
|   /** obtenir le salt d'un mot de passe hashé en SSHA */
 | |
|   static function get_ssha_salt(string $ssha): string {
 | |
|     return substr(base64_decode($ssha), 20);
 | |
|   }
 | |
| 
 | |
|   static function ssha(string $clear, ?string $salt=null): string {
 | |
|     if ($salt === null) $salt = random_bytes(20);
 | |
|     return base64_encode(sha1("$clear$salt", true).$salt);
 | |
|   }
 | |
| 
 | |
|   static function ntlm(string $clear): string {
 | |
|     $string = iconv("UTF-8", "UTF-16LE", $clear);
 | |
|     return strtoupper(bin2hex(hash("md4", $string, true)));
 | |
|   }
 | |
| 
 | |
|   private static function lm_des_encrypt(string $string) {
 | |
|     $len = strlen($string);
 | |
|     $tmp = [];
 | |
|     for ($i = 0; $i < 7; $i++) {
 | |
|       $tmp[] = $i < $len? ord($string[$i]): 0;
 | |
|     }
 | |
|     $key = [];
 | |
|     $key[] = $tmp[0] & 254;
 | |
|     $key[] = ($tmp[0] << 7) | ($tmp[1] >> 1);
 | |
|     $key[] = ($tmp[1] << 6) | ($tmp[2] >> 2);
 | |
|     $key[] = ($tmp[2] << 5) | ($tmp[3] >> 3);
 | |
|     $key[] = ($tmp[3] << 4) | ($tmp[4] >> 4);
 | |
|     $key[] = ($tmp[4] << 3) | ($tmp[5] >> 5);
 | |
|     $key[] = ($tmp[5] << 2) | ($tmp[6] >> 6);
 | |
|     $key[] = $tmp[6] << 1;
 | |
| 
 | |
|     $key0 = "";
 | |
|     foreach ($key as $k) {
 | |
|       $key0 .= chr($k);
 | |
|     }
 | |
|     $crypt = openssl_encrypt("KGS!@#$%", "des-ecb", $key0
 | |
|       , OPENSSL_RAW_DATA + OPENSSL_ZERO_PADDING);
 | |
| 
 | |
|     return bin2hex($crypt);
 | |
|   }
 | |
| 
 | |
|   static function lm(string $clear): string {
 | |
|     $string = strtoupper(substr($clear,0,14));
 | |
|     $part1 = self::lm_des_encrypt(substr($string, 0, 7));
 | |
|     $part2 = self::lm_des_encrypt(substr($string, 7, 7));
 | |
|     return strtoupper($part1.$part2);
 | |
|   }
 | |
| 
 | |
|   private static $lsc_key;
 | |
| 
 | |
|   static function init_lsc(string $key): void {
 | |
|     self::$lsc_key = hex2bin($key);
 | |
|   }
 | |
|   private static function lsc_key(): string {
 | |
|     $lsc_key = self::$lsc_key;
 | |
|     if ($lsc_key === null) {
 | |
|       throw IllegalAccessException::unexpected_state("init_lsc");
 | |
|     }
 | |
|     return $lsc_key;
 | |
|   }
 | |
| 
 | |
|   static function is_lsc_available(): bool {
 | |
|     return self::$lsc_key !== null;
 | |
|   }
 | |
| 
 | |
|   static function decrypt_lsc(string $lsc): string {
 | |
|     return openssl_decrypt($lsc, "aes-128-ecb", self::lsc_key());
 | |
|   }
 | |
| 
 | |
|   static function encrypt_lsc(string $clear): string {
 | |
|     return openssl_encrypt($clear, "aes-128-ecb", self::lsc_key());
 | |
|   }
 | |
| }
 |