Расшифровка данных cookie сеансов Gorilla

Во-первых, позвольте мне в предисловии сказать, что я принимаю участие в конкурсе «Захват флага», и у меня возникли некоторые трудности с вопросом, связанным с Go Gorilla Sessions. Я никогда не программировал на Go, так что это весело и разочаровывает :)

У меня есть секретный ключ. У меня есть закодированный файл cookie. Мне нужно расшифровать куки, используя секретный ключ, который у меня есть, отредактировать все данные, которые там есть, и повторно зашифровать с моими измененными данными, чтобы пройти испытание.

Я прочитал документацию по пакету сеансов Gorilla и не получил никакой помощи.

Кто может помочь, с чего начать?


person Community    schedule 25.09.2016    source источник
comment
Вы смотрели на реализацию кодека в библиотеке securecookie, используемой сеансом Gorilla? github.com/gorilla/securecookie/blob/master/securecookie.go   -  person Ben Campbell    schedule 25.09.2016
comment
спасибо, я сначала отклонил это, так как намек на вызов сказал мне посмотреть на сеансы Gorilla, а не на SecureCookie. Тем не менее, имеет смысл использовать этот пакет, так что спасибо, что поделились!   -  person    schedule 26.09.2016


Ответы (1)


Глядя на документы - горилла предоставляет безопасный пакет cookie. В зависимости от архитектуры вашего приложения базовая реализация может работать следующим образом:

Создайте пакет управления сеансом, который будет использоваться вашим приложением. Для примера - назовем его sessionmngr

Внутри sessionmngr импортируйте "github.com/gorilla/securecookie".

В пакете sessionmngr используйте функцию init() в нижнем регистре для настройки частного экземпляра securecookie. После импорта пакета функции init() в нижнем регистре вызываются в том порядке, в котором они объявлены. (Дополнительную информацию см. в spec). Вы будете использовать этот экземпляр для кодирования и декодирования файлов cookie из стандартной библиотеки http.Request.

import (
    "github.com/gorilla/securecookie"      

    //you will need this later
    "http" 
)

//declare private secure cookie 
var s *securecookie.SecureCookie

//initialize it here (taken from the gorilla docs example)
func init() {
    var hashKey = []byte("very-secret")
    var blockKey = []byte("a-lot-secret")
    s = securecookie.New(hashKey, blockKey)
}

Затем вы будете использовать s во всем пакете в функциях, которые должны кодировать и декодировать значение файла cookie. документация по пакету securecookie содержит шаблонный пример.

Чтобы выполнить требования по чтению и изменению уже зашифрованного файла cookie, используйте методы Decode и Encode для экземпляра securecookie, который был настроен в приведенном выше примере.

Что-то вроде ---

func DecodeAndModify(w http.ResponseWriter, r *http.Request) {
    //get reference to cookie if set
    if cookie, err := r.Cookie("cookie-name"); err == nil {

        value := make(map[string]string)
        //use Decode to get the value from the cookie
        if err = s.Decode("cookie-name", cookie.Value, &value); err == nil {
            //modify the value in some way
            value["newKey"] = "newValue"
            //re-encode it
            if encoded, err := s.Encode("cookie-name", value); err == nil {
                cookie := &http.Cookie{
                    Name:  "cookie-name",
                    Value: encoded,
                    Path:  "/",
                }
                http.SetCookie(w, cookie)
            }
        }
    }
}
person syllabix    schedule 25.09.2016
comment
Спасибо Syllabix, ценю подробный ответ. Я считаю, что это именно то, что мне нужно, поэтому с благодарностью отмечаю ответ как правильный. - person ; 26.09.2016