Функция пароля MySQL

Я думаю, что есть еще одно элегантное решение.

Что вы хотите сделать (безопасно) «передать» тип типичного параметра типа от класса concerete до суперкласса.

Если вы позволяете себе думать о типе класса как «метаданных» в классе, это предполагает метод Java для кодирования метаданных во время выполнения: аннотации.

Сначала определите пользовательскую аннотацию вдоль этих строк :

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EntityAnnotation {
    Class entityClass();
}

Затем вы можете добавить аннотацию к вашему подклассу.

@EntityAnnotation(entityClass =  PassedGenericType.class)
public class Subclass<PassedGenericType> {...}

Затем вы можете использовать этот код, чтобы получить тип класса в базовом классе:

import org.springframework.core.annotation.AnnotationUtils;
.
.
.

private Class getGenericParameterType() {
    final Class aClass = this.getClass();
    EntityAnnotation ne = 
         AnnotationUtils.findAnnotation(aClass, EntityAnnotation.class);

    return ne.entityClass();
}

Некоторые ограничения этого подхода:

  1. Вы указываете общий тип (PassedGenericType) в двух местах, а не один, не являющийся сухим.
  2. Это возможно только в том случае, если вы можете изменить конкретные подклассы.
16
задан Wes 17 November 2009 в 19:24
поделиться

4 ответа

В документации к функции MySQL ПАРОЛЬ () указано:

Функция ПАРОЛЬ () используется система аутентификации в MySQL Server; вам не следует использовать его в своих собственных приложениях.

Прочтите « Вы, вероятно, храните пароли неправильно », чтобы получить более точные советы по хешированию и хранению паролей.

MD5 и SHA-1 считаются слишком слабыми для использования в паролях. Текущая рекомендация - использовать SHA-256.

Я внес в MySQL патч для поддержки функции SHA2 () , и патч был принят, но поскольку их план действий изменился, неясно, когда он превратится в выпущенный продукт.

А пока вы можете использовать хеширование и соление в своем языке программирования и просто сохранить хэш-дайджест результата в базе данных. Если вы используете PHP, SHA-256 доступен в функции hash () .

обновление: MySQL 5.5.8 был выпущен в декабре 2010 года, и этот выпуск содержит поддержку Функция SHA2 () .

но так как их план действий изменился, неясно, когда он превратится в выпущенный продукт.

Тем временем вы можете использовать хеширование и соление на своем языке программирования и просто сохранить хеш-дайджест результата в базе данных. Если вы используете PHP, SHA-256 доступен в функции hash () .

обновление: MySQL 5.5.8 был выпущен в декабре 2010 года, и этот выпуск содержит поддержку Функция SHA2 () .

но так как их план действий изменился, неясно, когда он превратится в выпущенный продукт.

Тем временем вы можете использовать хеширование и соление на своем языке программирования и просто сохранить хеш-дайджест результата в базе данных. Если вы используете PHP, SHA-256 доступен в функции hash () .

обновление: MySQL 5.5.8 был выпущен в декабре 2010 года, и этот выпуск содержит поддержку Функция SHA2 () .

23
ответ дан 30 November 2019 в 16:30
поделиться

Введение Не вдаваясь в технические и математические детали, было бы полезно немного объяснить разницу между шифрованием , хешированием и посол .

Шифрование Шифрование существует довольно долго. Египтяне использовали его для создания тайн и развлечений, а римляне использовали его для отправки секретных сообщений. Когда вы шифруете пароль, вы применяете какой-то алгоритм, который его взламывает. Применяя ключ, расшифровываем его.

ROT13 является простым примером алгоритма шифрования. Он в основном заменяет каждую букву на 13 мест в алфавите.

Не пей вино. = Qba'g qevax gur jvar. ROT13, очевидно, является довольно слабым алгоритмом, но здесь полезно проиллюстрировать ключевой момент - зашифрованные данные обратимы. Это так по замыслу. Нет смысла шифровать секретное сообщение, если человек на другом конце не может его расшифровать. Поэтому это полезно для таких вещей, как номера кредитных карт или электронные письма. Веб-браузер, в котором вы читаете это, также использует шифрование.

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

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

Используя нашу предыдущую фразу и алгоритм MD5, мы получаем ...

Не пей вино. = b290557177ec5dd7098d1de84616dd04 Если мы попробуем более длинную фразу ...

Пожалуйста, не пейте вино, оно ужасно на вкус. = fd870b20869d9ae05d84e3d7fbed0c94 Вы увидите, что результаты имеют одинаковую длину. Это означает, что несколько входов могут привести к одному и тому же выходу, называемому столкновением .

Хеширование полезно при хранении вещей, которые вам не нужно читать назад, но вы должны проверить. Пароли являются основным примером. Вместо хранения открытого текста вы сохраняете хешированную версию. Затем, когда кто-то вводит свой пароль, вы применяете тот же алгоритм хеширования и сравниваете его с тем, что есть в базе данных. Если они совпадают, то ворота открываются.

Хэш-функции также можно использовать для проверки того, была ли информация подделана. Отправляя электронное письмо, вы сначала сообщаете секретное значение, о котором знают только вы и получатель. Перед отправкой электронного письма вы подписываете его своим секретным значением и производите хэш-значение. Затем отправьте свое электронное письмо (без секретного значения) вместе со значением хеша. Ваш друг может затем выполнить тот же процесс, и если хэши совпадают, то они знают, что ваше сообщение не было подделано в процессе. Этот метод называется кодом аутентификации сообщения или кодом аутентификации сообщения на основе хэша.

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

Это особенно проблематично с паролями, которые обычно короткие и используют часто встречающиеся слова. Современному компьютеру не понадобилось бы очень много времени, чтобы пробежаться по большому словарю (или использовать существующие радужные таблицы) и выяснить результат хеширования каждого общего пароля.

Вот тут и начинается засолка.

Соление Помимо засорения ваших артерий, соли могут забить любого, кто пытается взломать хешированный пароль. Они работают, добавляя дополнительное секретное значение в конец ввода, увеличивая длину исходного пароля.

Скажите, что ваш пароль ненадежный, а значение соли - i.love.salt. Значение хеша будет составлено из обоих этих значений: rockyi.love.salt. Это обеспечивает некоторую защиту тем людям, которые используют общие слова в качестве пароля. Однако, если кто-то узнает о значении соли, которое вы используете, то он просто добавляет его в конец (или начало) каждого словарного слова, которое он пытается использовать в своей атаке.

Чтобы сделать это более сложным, вы можете использовать случайные соли, по одной на каждый пароль. Очевидно, что он должен храниться в базе данных, где-то в соответствии с учетной записью пользователя, но это делает грубую атаку намного сложнее. Наконец, вы можете создать соль из нескольких частей, вы можете использовать текущую дату-время, имя пользователя, секретную фразу, случайное значение или их комбинацию.

0
ответ дан 30 November 2019 в 16:30
поделиться

Если вы используете функцию базы данных для хеширования паролей, то по определению они должны поступать в базу данных без хеширования: поэтому я бы предпочел сделать это гораздо ближе к «источнику», то есть во внешнем приложении. чтобы вы не передавали разоблаченную информацию.

10
ответ дан 30 November 2019 в 16:30
поделиться

Я считаю, что фактическая функция ПАРОЛЬ в MySQL небезопасна и не работает, но в данный момент я не могу найти ссылку. Я знаю, что более старый ( OLD_PASSWORD в 5 и более поздних версиях) определенно небезопасен.

Конечно, все пароли всегда должны храниться с добавлением соли (для дальнейшей неясности). Пример:

UPDATE users SET password=MD5(CONCAT('salt', 'user provided value')) WHERE id=54

Существует также функция MD5 , но с появлением колоссальных радужных таблиц она не на 100% надежна как способ полной обфускации сохраненных паролей.

Более эффективный метод - хеширование пароль (с солью) до того, как он попадет в базу данных. Пример:

<?php
$password = sha1(SALT.$_POST["password"]);
$sql = "UPDATE users SET password='".$password."' WHERE id=54";
?>
6
ответ дан 30 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: