1. PHP / Говнокод #18253

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    class Security{
        
        private $workFactor, $salt;
        
        public function __construct(){
            $this->setWorkFactor();
            $salt = $this->getSaltBytes();
            $this->setSalt($salt);
        }
        
        public function hash($password, $workFactor = 6){
            $options = [
                'cost' => (int)$workFactor,
                'salt' => $this->getSalt()
            ];
            $hash = password_hash($password, PASSWORD_BCRYPT, $options);
            return $hash;
        }
    
        public function checkHash($password, $passwordHash, $options = []){
            if( isset($options['salt'])){
                $this->setSalt($options['salt']);
            }
            $workFactor = isset($options['workFactor']) ? 
                    $options['workFactor'] : $this->getWorkFactor();
            return $passwordHash === $this->hash($password, $workFactor);
        }
        
        public function isLegacyHash($passwordHash){
            return strlen($passwordHash) === 60;
        }
        
        public function getSalt(){
            return $this->salt;
        }
        
        public function setSalt($salt){
            $this->salt = $salt;
        }
        
        public function getSaltBytes($lenght = 24){
            return $this->getRandomBytes($lenght);
        }
    
        public function getRandomBytes($lenght = 24){
            $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $charactersLength = strlen($characters);
            $randomString = '';
            for ($i = 0; $i < $lenght; $i++){
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            return $randomString;
        }
        
        public function setWorkFactor($workFactor = 6){
            $this->workFactor = (int)$workFactor;
        }
        
        public function getWorkFactor(){
            return $this->workFactor;
        }
        
    }

    Запостил: Besmer, 28 Мая 2015

    Комментарии (28) RSS

    • Знаешь почему у меня нет девушки? Потому что я встаю на работу, работаю весь день в прокуренном офисе до заката. Затем в метро размышляю о жизни по дороге домой. И каждый вечер в однокомнатной одинокой квартирке я включаю свой компьютер и пишу очередной алгоритм шифрования, пока ещё не взломали старый. Мне кажется я секьюрный бог и каждый вечер спасаю мир и маленький сайтик.
      Ответить
    • > rand
      Отличный пример, как можно одной функцией просрать всю безопасность. А ведь код так хорошо начинался...

      P.S. Или автор это специально сделал, на случай внезапного увольнения?
      Ответить
      • Впрочем, если этой функцией только соль генерят - сойдёт.
        Ответить
        • Как с рандомной сорью жить? Надо чтобы на проверяющей и проверяемой "стороне" они были одинаковыми
          Ответить
          • > сорью
            Аска Лэнгли?

            > они были одинаковыми
            А они и будут. При задании пароля результаты getSalt() и hash() запишут в базу. А при проверке в checkHash() соль из базы попадает через $options (или через setSalt(), как вариант).
            Ответить
            • Та, что у тебя на Аве? Совпадение?
              Ответить
              • Она самая :3

                И жить с ней трудно, Синдзи подтвердит.
                Ответить
            • Смотрю я ваш этот Евангелион - пока 3 гг не вызывают ничего кроме желания уебать
              Ответить
              • > 3 гг не вызывают ничего кроме желания уебать
                Перечисли.

                Ну Мисато же няша, её то не хочется уебать? :)
                Ответить
              • Дропнул на пятой серии и тебе советую.
                Ответить

    Добавить комментарий