Я ищу способ осмотреть содержание a HttpServletResponse
подписать их с хешем MD5.
Псевдокод мог бы быть похожим на это
process(Response response, Request request){
defaultProcessingFor(response,request);
dispatcher.handle(response,request);
// Here I want to read the contents of the Response object (now filled with data) to create a MD5 hash with them and add it to a header.
}
Это возможно?
Да, это возможно. Вам необходимо украсить ответ с помощью HTTPServletResponceWarapper
, в которой вы замените сервлета WARTUPUTSTREAM
с пользовательской реализацией, которая записывает байты как Digest MD5, так и «оригинальный» выходной сигнал. Наконец-то предоставьте аксес для получения окончательной суммы MD5.
Обновление Я просто для веселья играл немного вокруг него, вот пример kickoff:
Откатная упаковка:
public class MD5ServletResponse extends HttpServletResponseWrapper {
private final MD5ServletOutputStream output;
private final PrintWriter writer;
public MD5ServletResponse(HttpServletResponse response) throws IOException {
super(response);
output = new MD5ServletOutputStream(response.getOutputStream());
writer = new PrintWriter(output, true);
}
public PrintWriter getWriter() throws IOException {
return writer;
}
public ServletOutputStream getOutputStream() throws IOException {
return output;
}
public byte[] getHash() {
return output.getHash();
}
}
Вывод MD5:
public class MD5ServletOutputStream extends ServletOutputStream {
private final ServletOutputStream output;
private final MessageDigest md5;
{
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new ExceptionInInitializerError(e);
}
}
public MD5ServletOutputStream(ServletOutputStream output) {
this.output = output;
}
public void write(int i) throws IOException {
byte[] b = { (byte) i };
md5.update(b);
output.write(b, 0, 1);
}
public byte[] getHash() {
return md5.digest();
}
}
Как использовать его:
// Wrap original response with it:
MD5ServletResponse md5response = new MD5ServletResponse(response);
// Now just use md5response instead or response, e.g.:
dispatcher.handle(request, md5response);
// Then get the hash, e.g.:
byte[] hash = md5response.getHash();
StringBuilder hashAsHexString = new StringBuilder(hash.length * 2);
for (byte b : hash) {
hashAsHexString.append(String.format("%02x", b));
}
System.out.println(hashAsHexString); // Example af28cb895a479397f12083d1419d34e7.
Что вы пытаетесь сделать?
Возможно, вам может быть лучше взглянуть на стандартное формат сообщения и обернуть содержимое вашего ответа в таком сообщении и подписать это. Оат приходит на ум.
Кроме того, если вы включите SSL, клиент может быть уверен, что содержимое ответа не было поддано.
Я буду защищать использование символов Юникода на кнопках , но это действительно легко реализовать интерфейс Icon
и использовать paintIcon ()
, чтобы нарисовать все, что вы хотите. Хорошим примером является учебник «Создание реализации пользовательского значка» ; этот код показывает более сложную анимированную гистограмму .
Вот полный пример печати информации о любом дискриминируемом союзе. Он показывает, как получить случаи дискриминируемого союза, а также как получить поля (в случае, если они вам нужны). Функция печатает объявление типа данного дискриминируемого объединения:
open System
open Microsoft.FSharp.Reflection
let printUnionInfo (typ:Type) =
printfn "type %s =" typ.Name
// For all discriminated union cases
for case in FSharpType.GetUnionCases(typ) do
printf " | %s" case.Name
let flds = case.GetFields()
// If there are any fields, print field infos
if flds.Length > 0 then
// Concatenate names of types of the fields
let args = String.concat " * " [ for fld in flds -> fld.PropertyType.Name ]
printf " of %s" args
printfn ""
// Example
printUnionInfo(typeof<option<int>>)
-121--2672384- Технически термин «сигнатура» зарезервирован для, ну, сигнатуры, и хеш-функции их не вычисляют.
Чтобы гарантировать, что данные не были изменены при передаче с помощью хеш-функции, необходимо иметь безопасный внеполосный способ передачи хеш-значения; добавление значения хэша в заголовки HTTP не будет происходить, поскольку любой, кто может изменить передаваемые данные, может повторно вычислить хэш по желанию и изменить заголовки HTTP, как он сочтет нужным.
С помощью криптографии можно «сконцентрироваться», защищая внеполосную передачу, в повторно используемом ключе. Если клиент и сервер имеют общее секретное значение, неизвестное предполагаемому злоумышленнику, то акроним является MAC, как в «Коде аутентификации сообщений»; обычным MAC является HMAC .
Во многих практических ситуациях MAC нельзя использовать, поскольку MAC требует общего секрета, и секрет, который используется слишком много раз, больше не является секретом. Каждый держатель секрета имеет возможность повторного вычисления MAC. Если каждый клиент знает секрет, то в основном это не секрет и можно с уверенностью предположить, что злоумышленник тоже знает его. Следовательно, вы можете пойти дальше и использовать цифровые подписи (реальные, те, которые используют RSA, DSS, ECDSA...), в которых сервер использует закрытый ключ (который знает только сервер), и клиенты знают только соответствующий открытый ключ Знание открытого ключа достаточно для проверки подписей, но не для создания новых, и закрытый ключ не может быть повторно вычислен из открытого ключа (хотя они математически связаны друг с другом). Однако реализовать цифровую подпись и правильно использовать ее гораздо сложнее, чем это обычно предполагается; лучше всего использовать уже отлаженный протокол с существующими реализациями, и этот протокол называется SSL.
Здесь точка в том, что без SSL есть шансы, что все, что вы делаете, не удержит решительного нападающего; он просто использует циклы ЦП и пропускную способность сети и дает вам теплое нечеткое ощущение.