LINUX.ORG.RU

Короч вопрос недообъяснён про хэш?

 , , , ,


0

1

Есть типо цайт(site) на томкате(apache tomcat) и базка(database) мускл(mysql), есть страничка регистрации,там с помощью жээспэ(jsp) ли но можно сделать запрос к базке записать юзверя(user) в оную. Собственно как показывает это видео https://www.youtube.com/watch?annotation_id=annotation_1259954967&feature... с почти университета нужно выделить какую то строку, какого то размера(какого?) зависит от алгоритма(какого нибудь готовенького), есть люди знающие ответ? Пока что вот такая таблица есть

create table users (id integer auto_increment primary key, nickname varchar(30) UNIQUE KEY, email varchar(30),password varchar(8),reg_date DATETIME );
в ней пока что пароль хранится в открытом виде

Ответ на: комментарий от theNamelessOne

ну мне показалось логичным хранить хэш вместо открытого пароля и выделить поле для соли, в принципе нужен алгоритм на джаве вроде советовали sha-512 то есть соль и хэш длиной 512 бит(байт?) на клиенте будет алгоритм хэширования и генерации соли при регистрации либо тянущий соль с базы данных при повторном логировании

Gremlin_ ()
Ответ на: комментарий от Gremlin_

вроде советовали sha-512

Нет, надо брать хеши, которые специально разрабатывались для хеширования паролей: argon2, Pbkdf2, bcrypt/scrypt.

на клиенте будет алгоритм хэширования и генерации соли при регистрации либо тянущий соль с базы данных при повторном логировании

Тебе надо хранить хеш пароля вместе со всеми параметрами, обычно их конкатенируют в одну строку каким-нибудь разделителем. Вот пример для argon2:

$argon2d$v=19$m=1024,t=1,p=1$c29tZXNhbHQ$ppn3GC6VAoNMXZ6Bp523NDwHl1DNsxHtSGnJ9HXYsZI

Сначала идёт название хеша, потом параметры, потом соль, потом сам хеш, в качестве разделителя используется $.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)

Короче не стал много думать и вот код мд5 пока что пусть так может потом передумаю, каков должен быть размер в базе данных для строки из 32 символов? Учитывая что будет алгоритм хэширования в строке «md5$%some-hash%»?

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package example;

import org.apache.commons.codec.digest.DigestUtils;

/**
 *
 * @author User
 */
public class Example {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Java Правит Интернетом!");
        System.out.println(md5Apache("Java Правит Интернетом!"));
    }
    public static String md5Apache(String st) {
    String md5Hex = DigestUtils.md5Hex(st);
    return md5Hex;
    }
}

Gremlin_ ()
Ответ на: комментарий от Gremlin_

Если взглянуть на распространенные из коробки алгоритмы хеширования, то длина хеша едва ли переваливает за 128 байт.
Смело указывайте 128 или 256 символов как длина колонки, на случай если решите на раннем этапе сменить алгоритм.

md2           32 a9046c73e00331af68917d3804f70655                   
md4           32 866437cb7a794bce2b727acc0362ee27 
md5           32 5d41402abc4b2a76b9719d911017c592 
sha1          40 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 
sha256        64 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e730 
sha384        96 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553 
sha512       128 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2d 
ripemd128     32 789d569f08ed7055e94b4289a4195012 
ripemd160     40 108f07b8382412612c048d07d13f814118445acd 
ripemd256     64 cc1d2594aece0a064b7aed75a57283d9490fd5705ed3d66bf9a 
ripemd320     80 eb0cf45114c56a8421fbcb33430fa22e0cd607560a88bbe14ce 
whirlpool    128 0a25f55d7308eca6b9567a7ed3bd1b46327f0f1ffdc804dd8bb 
tiger128,3    32 a78862336f7ffd2c8a3874f89b1b74f2 
tiger160,3    40 a78862336f7ffd2c8a3874f89b1b74f2f27bdbca 
tiger192,3    48 a78862336f7ffd2c8a3874f89b1b74f2f27bdbca39660254 
tiger128,4    32 1c2a939f230ee5e828f5d0eae5947135 
tiger160,4    40 1c2a939f230ee5e828f5d0eae5947135741cd0ae 
tiger192,4    48 1c2a939f230ee5e828f5d0eae5947135741cd0aefeeb2adc 
snefru        64 7c5f22b1a92d9470efea37ec6ed00b2357a4ce3c41aa6e28e3b 
gost          64 a7eb5d08ddf2363f1ea0317a803fcef81d33863c8b2f9f6d7d1 
adler32        8 062c0215 
crc32          8 3d653119 
crc32b         8 3610a686 
haval128,3    32 85c3e4fac0ba4d85519978fdc3d1d9be 
haval160,3    40 0e53b29ad41cea507a343cdd8b62106864f6b3fe 
haval192,3    48 bfaf81218bbb8ee51b600f5088c4b8601558ff56e2de1c4f 
haval224,3    56 92d0e3354be5d525616f217660e0f860b5d472a9cb99d6766be 
haval256,3    64 26718e4fb05595cb8703a672a8ae91eea071cac5e7426173d4c 
haval128,4    32 fe10754e0b31d69d4ece9c7a46e044e5 
haval160,4    40 b9afd44b015f8afce44e4e02d8b908ed857afbd1 
haval192,4    48 ae73833a09e84691d0214f360ee5027396f12599e3618118 
haval224,4    56 e1ad67dc7a5901496b15dab92c2715de4b120af2baf661ecd92 
haval256,4    64 2d39577df3a6a63168826b2a10f07a65a676f5776a0772e0a87 
haval128,5    32 d20e920d5be9d9d34855accb501d1987 
haval160,5    40 dac5e2024bfea142e53d1422b90c9ee2c8187cc6 
haval192,5    48 bbb99b1e989ec3174019b20792fd92dd67175c2ff6ce5965 
haval224,5    56 aa6551d75e33a9c5cd4141e9a068b1fc7b6d847f85c3ab16295 
haval256,5    64 348298791817d5088a6de6c1b6364756d404a50bd64e645035f

duck ()
Ответ на: комментарий от Gremlin_

И вот готовое почти решение:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.ZoneId;
import org.apache.commons.codec.digest.DigestUtils;
import java.util.*;
/**
 *
 * @author User
 */
public class Example {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Java Правит Интернетом!");
        System.out.println(md5Apache("Java Правит Интернетом!"));
        try{
             String url = "jdbc:mysql://localhost/test?serverTimezone=Europe/Moscow";
             String username = "root";
             String password = "root";
             Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
             try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                System.out.println("Connection to Store DB succesfull!");
                Statement statement = conn.createStatement();
                
                String pass = md5Apache("root");
                LocalDate date = LocalDate.now( ZoneId.of( "Europe/Moscow" ) );
                
                String sql = "INSERT users(nickname,email,password,reg_date) VALUES ('i-rinat','rinat@mail.ru',?,?)";
                PreparedStatement preparedStatement = conn.prepareStatement(sql);
                preparedStatement.setString(1, pass);
                preparedStatement.setDate(2, java.sql.Date.valueOf(date));
                int rows = preparedStatement.executeUpdate();
                System.out.printf("Added %d rows", rows);
             }
         }
         catch(Exception ex){
             System.out.println("Connection failed...");
              
             System.out.println(ex);
         }
    }
    public static String md5Apache(String st) {
        String md5Hex = DigestUtils.md5Hex(st);
        return md5Hex;
    }
}

Gremlin_ ()
Ответ на: комментарий от Gremlin_

тут короче в базе данных идет дата+время,а код на жабке дает в базу только дату

А нафига вы передаете данные для поля DATETIME в запросе? Опишите reg_date DATETIME default CURRENT_TIMESTAMP и сервер БД сам дату-время проставит

sigurd ★★★ ()
Ответ на: комментарий от tz4678

ну они там хранятся одинаково разницы между varchar и text при тестах нет

А между varchar(n) и text разница есть (runtime check на длину), как и между char/varchar.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от tz4678

Сравнение хешей строковыми/символьными сравнивалками НЕ БЕЗОПАСНО и правильный хеш может быть сбручен довольно быстро. Сравнивать должен специальный алгоритм, причём, хеши могут быть совершенно разными посимвольно.

deep-purple ★★★★★ ()
Ответ на: комментарий от Gremlin_

Который при сравнении проходит хеши от первого до последнего «символа», что время сравнения всегда постоянно, а не тот, где первый «символ» не сошёлся и сразу фелс возвращает.

deep-purple ★★★★★ ()