Это не красиво, но работает: реализовать тип, подобный CancelWithRunnableFuture
, который вы можете предоставить Runnable
для ..., который Runnable
вызывается внутри метода cancel()
.
@Service
class AsyncService {
@Async("taskExecutor")
public Future<Task> startAsyncProcess(Task task) {
Thread threadToInterruptOnCancel = new Thread(() -> System.out.println("Some continuous async db write"));
threadToInterruptOnCancel.start();
return new CancelWithRunnableFuture(
AsyncResult.forValue(task),
() -> threadToKillOnCancel.interrupt());
}
}
class CancelWithRunnableFuture<V> implements Future<V> {
private Future<V> delegate;
private Runnable runOnCancel;
public CancelWithRunnableFuture(Future<V> delegate, Runnable runOnCancel) {
this.delegate = delegate;
this.runOnCancel = runOnCancel;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
//
// The Runnable is run here!
//
runOnCancel.run();
return delegate.cancel(mayInterruptIfRunning);
}
@Override
public boolean isCancelled() {
return delegate.isCancelled();
}
@Override
public boolean isDone() {
return delegate.isDone();
}
@Override
public V get() throws InterruptedException, ExecutionException {
return delegate.get();
}
@Override
public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return delegate.get(timeout, unit);
}
}
MD5 обычно считают небезопасным, если хэш-коллизии являются главным беспокойством. SHA1 аналогично больше не считает приемлемым американское правительство. Существует, была конкуренция полным ходом для нахождения заменяющего хеш-алгоритма, но рекомендация в данный момент состоит в том, чтобы использовать семейство SHA2 - SHA-256, SHA-384 или SHA-512. [Обновление: 02.10.2012 NIST выбрали SHA 3, чтобы быть алгоритмом Keccak.]
Можно попытаться создать собственный хеш — это, вероятно, не было бы столь же хорошо, как MD5, и 'безопасность через мрак' аналогично не желательны.
Если Вы хотите безопасность, хешируете с несколькими хеш-алгоритмами. Способность одновременно создать файлы, которые имеют хэш-коллизии с помощью многих алгоритмов, является чрезмерно невероятной. [И в свете комментариев позвольте мне прояснить: Я имею в виду, публикуют и SHA-256 и значения Джакузи для файла — не комбинирующий хеш-алгоритмы для создавания единственной стоимости, но использующий отдельные алгоритмы для создавания отдельной стоимости. Обычно поврежденный файл не будет соответствовать ни одному из алгоритмов; если, случайно, кому-то удалось создать стоимость коллизии с помощью одного алгоритма, шанс также создания второй коллизии в одном из других алгоритмов незначителен.]
Общественность TimeStamp использует массив алгоритмов. Посмотрите, например, sqlcmd-86.00.tgz для иллюстрации.
Если пользователь не знает Вашего алгоритма хеширования, он также не может проверить Вашу подпись на документе, который Вы на самом деле подписали.
Наилучший вариант состоит в том, чтобы использовать односторонние алгоритмы хеширования с открытым ключом, которые генерируют самый длинный хеш. SHA-256 создает 256-разрядный хеш, таким образом, подделыватель должен был бы попробовать 2 255 различных документов (в среднем), прежде чем они создали тот, который соответствовал данному документу, который довольно безопасен. Если это все еще не достаточно безопасно для Вас, существует SHA-512.
Кроме того, я думаю, что стоит упомянуть, что хороший не использующий высокие технологии способ защитить себя от подделанных снабженных цифровой подписью документов состоит в том, чтобы просто сохранить копию чего-либо, что Вы подписываете. Тот путь, если это сводится к спору, можно показать, что оригинал документа, который Вы подписали, был изменен.
Почему Вы пытаетесь создать свой собственный хеш-алгоритм? Что случилось с SHA1HMAC?
Да, существуют повторения для хешей.
Любой хеш, который короче, чем простой текст, является обязательно меньшей информацией. Это означает, что будут некоторые повторения. Ключ для хешей - то, что повторения трудно перепроектировать.
Считайте CRC32 - наиболее часто используемым как хеш. Это - 32-разрядное количество. Поскольку существуют больше, чем 2^32 сообщения во вселенной, затем будут повторения с CRC32. Та же идея относится к другим хешам.
Существует иерархия трудности (для взломщика) здесь. Легче найти два файла с тем же хешем, чем генерировать тот для соответствия данному хешу, и легче сделать позже, если Вы не должны уважать ограничения формы/содержания/длин.
Таким образом, если возможно использовать четко определенную структуру документа и длины, можно сделать жизнь взломщиков немного тяжелее, какой хеш подчиненного Вы используете.
Я не думаю придумывающий Ваш собственный хеш-алгоритм, хороший выбор.
Другой хороший вариант используется Соленый MD5. Например, вход к Вашей хеш-функции MD5 добавляется со строкой "acidzom! #" прежде, чем передать функции MD5.
Существует также хорошее чтение в Slashdot.
Это называют "хэш-коллизией" и лучшим способом избежать, чтобы он использовал сильную хеш-функцию. MD5 относительно легок искусственно создать сталкивающиеся файлы, как замечено здесь. Точно так же известно, что существует относительно эффективный способ для вычислений столкновения файлы SH1, хотя в этом случае "относительно эффективный" все еще берет hunreds часов, вычисляют время.
Обычно MD5 и SHA1 являются все еще дорогими для взламывания, но не невозможные. Если Вы действительно волнуетесь по поводу этого, используйте более сильную хеш-функцию, как SHA256.
Запись Вашей собственной не является на самом деле хорошая идея, если Вы не довольно опытный шифровальщик. большинство простых идей попробовали и существуют известные нападения на них.
Если Вы действительно хотите узнать больше о нем, взглянуть на Прикладную Криптографию Schneier.