Golang Проверка подписи Base64 VS CryptoJS - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь преобразовать a Node.js сценарий в Golang. Тем не менее, я всегда получаю ошибку "error: illegal base64 data at input byte 40" при декодировании Base64 . Может кто-нибудь мне помочь, уже отлаживать и читать документацию в течение нескольких часов ... Нужна помощь!

// Node.js exampe (code copied from Facebook Instant game SDK example)
const CryptoJS = require('crypto-js');
var firstpart = signedRequest.split('.')[0];
firstpart = firstpart.replace(/-/g, '+').replace(/_/g, '/');
const signature = CryptoJS.enc.Base64.parse(firstpart).toString(); // <-- fail here
const dataHash = CryptoJS.HmacSHA256(signedRequest.split('.')[1], '<APP_SECRET>').toString();
var isValid = signature === dataHash;
const json = CryptoJS.enc.Base64.parse(signedRequest.split('.')[1]).toString(CryptoJS.enc.Utf8);
const data = JSON.parse(json);

Код выше - это пример кода из Facebook, а следующий код (ниже) написан мной.

    parts := strings.Split(signedRequest, ".")
    firstPart := parts[0]
    replaced := strings.Replace(firstPart, "-", "+", -1)
    replaced = strings.Replace(replaced, "_", "/", -1)

    signatureByte, err := base64.StdEncoding.DecodeString(replaced) // <-- ERROR here
    if err != nil {
        fmt.Println("error:", err)
        return false, err
    }
    signature := string(signatureByte)

    dataHash := createHmacSHA256(parts[1], "<APP_SECRET>") // TODO: not sure, to string or hex string?

    isValid := signature == dataHash
    if isValid {
        return true, nil
    }

Детская площадка Go находится здесь https://play.golang.org/p/ilSbqamFdV_-

1 Ответ

2 голосов
/ 30 марта 2020

Прежде всего, избавьтесь от strings.Replace s и просто используйте base64.URLEncoding вместо StdEncoding, так как алфавит URL явно соответствует вашим данным.

Кроме того, стандартные данные base64 дополняется, но ваши данные не дополняются, поэтому вам нужно «сырое» кодирование, т.е. base64.RawURLEncoding. Это работает:

firstPart := parts[0]
signatureByte, err := base64.RawURLEncoding.DecodeString(firstPart)

https://play.golang.org/p/Pj_LLfirU8M

См. base64 пакет документов и base64 стандарт для получения дополнительной информации.

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