
рд╢реБрдн рд░рд╛рддреНрд░рд┐ рд╕рдЬреНрдЬрдиреЛрдВ рдФрд░ рджреЗрд╡рд┐рдпреЛрдВ!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрддреАрдд рдореЗрдВ рдордВрдЪ рд▓реЛрдХрдкреНрд░рд┐рдп рдереЗ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, phpBB рдордВрдЪ рд▓реЛрдХрдкреНрд░рд┐рдп рдереЗред рдЖрдЬ, рдореЗрд░реЗ рдХреБрдЫ рдкрдЫрддрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╕рд╛рдорд╛рдЬрд┐рдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рджреЗрддреЗ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рдЧрдП рд╣реИрдВред
рдореЗрд░реА рдкреЛрд╕реНрдЯ рдЖрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧреА рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реА # рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде phpBB рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрдИ рд▓реЛрдЧ рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╣реЛрдВрдЧреЗ ...
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ
рдЬрд┐рд╕рдореЗрдВ \ functions.php рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди
phpbb_check_hash ,
_hash_crypt_pStreet рдФрд░
_hash_encode64 рдвреВрдВрдвреЗрдВ ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ C # рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╡реЗ phpBB рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
using System.Security.Cryptography; using System.Text;
рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ C # рдореЗрдВ рдЕрдкрдирд╛рдП рдЧрдП рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдирд╛рдо рдирд╣реАрдВ рдмрджрд▓реЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ phbBB рдХреЗ рд╕рдорд╛рди рд╣реА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред
public bool phpbb_check_hash(string password, string hash) { var itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; if (hash.Length == 34) { return (_hash_crypt_private(password, hash, itoa64) == hash) ? true : false; } return (Md5(Encoding.UTF8.GetBytes(password)) == Encoding.UTF8.GetBytes(hash)) ? true : false; }
public string _hash_crypt_private(string password, string setting, string itoa64) { var output = "*"; if (setting.Substring(0, 3) != "$H$" && setting.Substring(0, 3) != "$P$") { return output; } var countLog2 = itoa64.IndexOf(setting[3]); if (countLog2 < 7 || countLog2 > 30) { return output; } var count = 1 << countLog2; var salt = setting.Substring(4, 8); if (salt.Length != 8) { return output; } var str = new byte[Encoding.UTF8.GetBytes(salt).Length + Encoding.UTF8.GetBytes(password).Length]; Array.Copy(Encoding.UTF8.GetBytes(salt), 0, str, 0, Encoding.UTF8.GetBytes(salt).Length); Array.Copy(Encoding.UTF8.GetBytes(password), 0, str, Encoding.UTF8.GetBytes(salt).Length, Encoding.UTF8.GetBytes(password).Length); var hash = Md5(str); do { str = new byte[hash.Length + Encoding.UTF8.GetBytes(password).Length]; Array.Copy(hash, 0, str, 0, hash.Length); Array.Copy(Encoding.UTF8.GetBytes(password), 0, str, hash.Length, Encoding.UTF8.GetBytes(password).Length); hash = Md5(str); } while (--count != 0); output = setting.Substring(0, 12); output += _hash_encode64(hash, 16, itoa64); return output; }
public string _hash_encode64(byte[] input, int count, string itoa64) { var output = ""; var i = 0; do { int value = input[i++]; output += itoa64[value & 0x3f]; if (i < count) { value |= input[i] << 8; } output += itoa64[(value >> 6) & 0x3f]; if (i++ >= count) { break; } if (i < count) { value |= input[i] << 16; } output += itoa64[(value >> 12) & 0x3f]; if (i++ >= count) { break; } output += itoa64[(value >> 18) & 0x3f]; } while (i < count); return output; }
public byte[] Md5(byte[] str) { var md5CryptoServiceProvider = new MD5CryptoServiceProvider(); return md5CryptoServiceProvider.ComputeHash(str); }
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдореЗрдВ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдордВрдЪреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдлрд╡рд╛рд╣ рдЙрдбрд╝рд╛рдИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдЬрдирддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж!