1. Java / Говнокод #14228

    +72

    1. 1
    2. 2
    3. 3
    4. 4
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5ANDTRIPLEDES");
    PBEKeySpec spec = new PBEKeySpec(password, salt, 1024, 128);
    SecretKey key = factory.generateSecret(spec);
    hexdump(key.getEncoded());

    http://ideone.com/bVElQG

    Не, ну я все понимаю, PKCS #5 1.5 аля PBE, MD5 и DES не считаются безопасными алгоритмами... но не настолько же...

    Запостил: bormand, 14 Декабря 2013

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

    • BUMP

      http://www.youtube.com/watch?v=gymNWGBR9zs
      Кому-то были нужны кавказцы? На 47 секунде.


      Говно в переизобретении (research) своего алгоритма шифрования?
      Ответить
      • > Говно в переизобретении своего алгоритма шифрования?
        Не, говно в том, как ключ шифрования порождается на основе пароля.

        PBKDF2 (аля PKCS #5 2.0) реализован нормально, его я и буду юзать.

        А PBE (аля PKCS #5 1.5) почему-то реализовали через анус. И порожденный ключ представляет собой... Ну ты видишь, по выхлопу, что он из себя представляет.
        Ответить
    • DES уже не считается, 56 бит это мало.
      Ответить
      • Да забей, на время, на 56 бит, тем более что у 3-des все-таки 56*3, что прилично. Ты посмотри на вторую строчку выхлопа на ideone. Видишь, как замечательно порождается ключ на основе пароля... Ничего не напоминают эти байты? :)
        Ответить
        • каждая буква слова (в данном случае password) + n?
          Ответить
          • > каждая буква слова (в данном случае password) + n
            Хуже, просто каждая буква слова. Очень секьюрное порождение ;)

            Где обещанные алгоритмом 1024 итерации md5? Где соль? Где 128 бит выхлопа то в конце-концов...

            Суть KDF (key derivation function) в том, чтобы затруднить перебор паролей, и сделать его настолько же сложным, насколько брутфорс ключей (а 128 бит это дофига). Рандомная соль заставляет подбирать каждый пароль по-отдельности. Большое количество итераций (рекомендуется минимум 1000, но можно и больше, например часто берут столько, чтобы комп считал их целых 100мс) сильно снижает скорость перебора. Ну и нормальная KDF должна выдавать нужное выбранному нами алгоритму количество бит (например 128 или 256) вне зависимости от длины пароля.
            Ответить
            • Причём все алгоритмы, название которых начинается с PBEWITH..., почему-то выдают один и тот же результат.
              Ответить
              • Как оказалось - я просто не умею их готовить, и для PBEWITH* нужно продолжить вот так:
                Cipher cipher = Cipher.getInstance(key.getAlgorithm());
                PBEParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
                cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
                Х.з. почему у них такая извращенная логика, и надо передавать соль и число итераций прямо алгоритму шифрования, а не алгоритму порождения ключа. Видимо, реальное порождение ключа идет уже в init().

                Но в принципе PBEWITH* и не нужны, т.к. им на смену придумали PBKDF2, который и посекьюрней, и реализован в жабе правильно (сверял на рандомных векторах со своей наколенной реализацией). А хардкорщики могут юзать scrypt.
                Ответить
            • Влом смотреть, что делает key.getEncoded()
              Ответить
        • AES быстрее 3des
          Ответить
          • Да я разве спорю ;) Кстати, интересно, пользуется ли изкоробочный жабий криптопровайдер инструкциями для ускорения аес, которые есть на интелах?
            Ответить
    • А сколько сейчас бит годно на ключ для не взлома стойкой с видеокартами при условии что нет обнаруженных дыр в алгоритмах и квантового компа под рукой?
      Ответить
    • А че, в жавке можно блоки делать просто так? А зачем?
      Ответить
      • В си тоже можно. Мне лень было по-нормальному писать тест, поэтому скопипастил и обернул в блок, чтобы одноименные переменные не конфликтовали.
        Ответить
        • Я думал только в перле такая хуйня. А какое-то применение у него есть, скажем, break/return в конец блока?
          Ответить
          • Ну в жабе можно break из такого блока делать. А в крестах можно юзать ради сокращения скопа, чтобы деструктор у переменной сработал чуть раньше, чем обычно. Ну и для вот такого говноприменения, как в топике.

            В общем-то даже в паскале вроде бы можно писать begin и end просто так. Скобки это же самый обычный statement, который можно юзать в любом месте, где допустимы statement'ы.
            Ответить
            • В Паскале можно: http://ideone.com/o1UR5O

              Только в нём оно совершенно без надобности. В Алголе хотя бы можно в начале каждого блока объявлять переменные, а тут ни локальных объявлений, ни брейков, ни деструкторов... Для чего-то серьёзного приходится объявлять вложенную процедуру/функцию.
              Ответить

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