Как превратить * rsa.PublicKey в узнаваемую строку ключа - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть эта функция:

func GetSigningKey() *rsa.PublicKey {
    set, _ := jwk.ParseString(GetWellKnown())
    publicKey, _ := set.Keys[0].Materialize()
    return publicKey.(*rsa.PublicKey)
}

.Materialize() возвращает interface{}, поэтому я использую эту функцию для приведения ее (как мне кажется,) к ожидаемому типу.

Затем я могу использовать этот токен с:

publicKey := GetSigningKey()

token, _ := jwt.Parse(tokenString, func(*jwt.Token) (interface{}, error) {
    return publicKey, nil
})

fmt.Println(token.Valid)

Несколько вопросов:

Цель функции GetSigningKey - получить ключ подписи из хорошо известного файла и привести полученный результатвведите правильный тип.

1) Для этого требуется http-запрос, который находится в пределах GetWellKnown().В этой функции я выполняю http-запрос и кеширую ответ в переменной, поэтому следующие запросы будут извлекаться из этой переменной.Это хорошая практика?(уточните, должен ли я сделать то же самое с разобранным открытым ключом в GetSigningKey())

2) Прав ли я, полагая, что это лучший способ приведения interface{} к правильному типу?

3) если я попытаюсь fmt.Println(GetSigningKey()) я получу длинную неузнаваемую последовательность чисел

&{2568409364095596940117712027335...  %!s(int=65537)}635 <nil>

Что именно я здесь вижу?

1 Ответ

0 голосов
/ 25 ноября 2018

В вашем коде нет проверки ошибок.Особенно, если JWKS пуст или содержит что-то, что не является ключом RSA, ваша программа просто аварийно завершает работу, и это обычно не приветствуется в Go.Я бы добавил некоторые проверки вокруг всего этого;например,

func GetSigningKey() *rsa.PublicKey, error {
        ...
        if rsaKey, ok := publicKey.(*rsa.PublicKey); ok {
                return rsaKey, nil
        }
        return nil, errors.New("not an RSA key")
}

Помните, что существуют другие методы подписи , и в принципе вы можете получить ключ ECDSA или (теоретически) необработанный ключ для симметричной подписи, поэтому проверка здесьценный.

Другая высокоуровневая вещь, которую вы должны попробовать, это взять необработанный веб-токен JSON и декодировать его;https://jwt.io/ имеет отладчик, который я использую.Если в заголовке содержится утверждение с именем "kid", то есть идентификатор ключа, и вы должны иметь возможность передать этот идентификатор ключа в качестве входных данных в библиотеку JWKS.Это должно быть более надежным, чем слепое использование первого ключа в JWKS.

Онлайн-документы JWKS могут изменяться, но, как правило, это происходит нечасто (в масштабе месяцев).(Если они меняются, вполне вероятно, что JWKS будет включать как старые, так и новые ключи.) Кэширование их в процессе чрезвычайно разумно.Если вы видите "kid", вы не можете распознать, что это может быть сигналом для попытки повторного получения документа.

Ваш вывод fmt.Printf выглядит так, как будто это, вероятно, необработанный открытый ключ RSA.Сам открытый ключ состоит из двух чисел, одно из которых является произведением двух больших простых чисел, а второе часто точно равно 65537. Об этом более подробно говорится в описании Википедии RSA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...