Мне нужно сгенерировать хешированную строку (md5 или sha-1 или что-то еще), которая не содержит запятую или следующую строку, потому что я сохраняю еще несколько данных в файле csv. Я пробовал после обычного создания md5 заменить все вхождения ',' и '\ n' на String.replace, но почему-то все еще есть некоторые символы новой строки или некоторые символы, которые ведут себя как новая строка. Есть ли способ генерировать только алфавиты и числа в строке при шифровании?

Изменить: я понял, что то, о чем я прошу, - это плохо, потому что это сделает 'abcd' и ', abcd' одинаковыми, как указано GhostCat. На самом деле, это не производственная среда, и мне просто нужно некоторое хеширование, которое дает согласованный результат для каждого ввода и возможность сохранить его в файлах csv.

Это мой код

    public static String hashPassword(String password)
    {
        MessageDigest md=null;
        try {
            md=MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        String passwd=new String (md.digest(password.getBytes()));

        //To convert it to ',' so that it'll be removed with other ',''s
        passwd=passwd.replace('\n',',');
        passwd=passwd.replace(",","");
        return passwd;
    }
-2
Naveen Attri 27 Ноя 2016 в 23:40

2 ответа

Лучший ответ

Не используйте new String() или getBytes() без указания кодировки. Как только вы перейдете на другую платформу (с другой кодировкой по умолчанию), эта резко взорвется.

Самый безопасный способ - преобразовать байты в шестнадцатеричную строку, хотя это также удвоит размер, необходимый для ее хранения. Например. (с использованием UTF-8 в качестве кодировки)

BigInteger foo = new BigInteger(md.digest(password.getBytes("UTF-8"))); 
String hex = foo.toString(16);

Обратите внимание, что код примера не является «производственным», см. Комментарии.

2
Kayaman 28 Ноя 2016 в 06:51

Мне кажется, это неправильный подход.

Дело в том, что при хешировании важен каждый бит ввода и вывода! Просто удаление некоторых произвольных элементов вывода, потому что они создают проблемы с представлением вашего формата файла ... не лучший вариант.

Видите ли, в какой-то момент вы хотите сравнить два хэша, и я почти уверен, что вы хотите

hash1: abcdf,

И

hash2: ,abcdf

Быть другим . Когда вы просто отбрасываете те значения, которые вам не нравятся ... вы больше не сможете этого делать!

Итак, если вы посмотрите здесь, настоящий ответ будет следующим:

Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки.

Другими словами: ваш код, который читает / записывает значения в CSV, должен иметь возможность работать с этими и новыми строками. В противном случае проблема заключается в парсере CSV.!

0
Community 23 Май 2017 в 12:30