MD5 подписывая HttpServletResponse

Я ищу способ осмотреть содержание 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.
}

Это возможно?

6
задан Pablo Fernandez 2 February 2010 в 00:55
поделиться

3 ответа

Да, это возможно. Вам необходимо украсить ответ с помощью 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.
6
ответ дан 17 December 2019 в 00:09
поделиться

Что вы пытаетесь сделать?

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

Кроме того, если вы включите SSL, клиент может быть уверен, что содержимое ответа не было поддано.

0
ответ дан 17 December 2019 в 00:09
поделиться

Я буду защищать использование символов Юникода на кнопках , но это действительно легко реализовать интерфейс Icon и использовать paintIcon () , чтобы нарисовать все, что вы хотите. Хорошим примером является учебник «Создание реализации пользовательского значка» ; этот код показывает более сложную анимированную гистограмму .

-121--4571456-

Вот полный пример печати информации о любом дискриминируемом союзе. Он показывает, как получить случаи дискриминируемого союза, а также как получить поля (в случае, если они вам нужны). Функция печатает объявление типа данного дискриминируемого объединения:

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 есть шансы, что все, что вы делаете, не удержит решительного нападающего; он просто использует циклы ЦП и пропускную способность сети и дает вам теплое нечеткое ощущение.

1
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

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