Декодировать base64 с пробелами - PullRequest
0 голосов
/ 30 августа 2018

У меня есть строка в кодировке base64, которую я пытаюсь расшифровать с помощью go. Строка содержит пробелы, которые следует игнорировать. Пример кода, который я пытаюсь:

s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"

out, err := base64.URLEncoding.DecodeString(s)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(string(out))

Этот код возвращает:

недопустимые данные base64 на входном байте 93


После изменения заполнения строк и использования StdEncoding вместо URLEncoding:

s= strings.Replace(s, "%3D", "=", -1)
out, err := base64.StdEncoding.DecodeString(s)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(string(out))

Вывод будет:

{ "threeDSServerTransID": "13fe71d4-d10d-4220-a216-2006d1dd4cb8", "acsTrc nsID ": "d7c45f99-9478-44a6-b1f2-100000003366", "MessageType": "CReq", "messageVersion": "2.1.0", "challengeWindowSize": "02"}


Как правильно расшифровать строку?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

То, что у вас есть, скорее всего, «отрезано» от URL-адреса, и оно находится в кодированной форме URL. Таким образом, чтобы получить строку Base64, вы должны сначала ее декодировать, для этого вы можете использовать url.PathUnescape().

Получив неэкранированную строку, вы можете декодировать ее с помощью кодера base64.StdEncoding. Обратите внимание, что только потому, что он является / был частью URL, это не делает его строкой base64, в которой использовался алфавит безопасной для URL версии Base64.

Кроме того, знаки + в центре этого на самом деле просто "мусор". Они не должны быть там, во-первых, так что перепроверьте, как вы получаете свой вклад, но теперь, когда они есть, вы должны удалить их. Для этого вы можете использовать strings.Replace().

Окончательный код для декодирования вашего неверного ввода:

s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"
s = strings.Replace(s, "+", "", -1)
var err error
if s, err = url.PathUnescape(s); err != nil {
    panic(err)
}

out, err := base64.StdEncoding.DecodeString(s)
if err != nil {
    panic(err)
}
fmt.Println(string(out))

Полный вывод (попробуйте на Go Playground ):

{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8",
   "acsTransID":"d7c45f99-9478-44a6-b1f2-100000003366","messageType":"CReq",
    "messageVersion":"2.1.0","challengeWindowSize":"02"}

Обратите внимание, что знак + является действительным символом в алфавите стандартного Base64, и вы даже можете декодировать Base64, не удаляя символы +, но тогда вы получите ненужные данные, оставшиеся в ключах JSON в результат.

0 голосов
/ 30 августа 2018

У входной строки три проблемы

Первые знаки + в середине

Во-вторых, мусор (закодированный + URL) в конце

В-третьих, строка не соответствует действительности. Base64

Чтобы удалить знаки плюса в середине, найдите индекс начала и конца и создайте новую строку Чтобы удалить мусор в конце, завершите строку раньше (по индексу 249 фиксированной строки)

Существует еще одна проблема со строкой в ​​индексе 148 фиксированной строки, которая, как я предполагаю, связана с неверными данными

Но фрагмент кода ниже показывает, как преодолеть первые две вещи

package main

import (
    "fmt"
    "encoding/base64"
    "strings"
)

func main() {
    s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"


    a:=strings.Index(s,"+")
    b:=strings.LastIndex(s,"+")+1

    fixed:=s[0:a] + s[b:249]
    out, err := base64.StdEncoding.DecodeString(fixed)
    if err != nil {
        fmt.Println(err)
        fmt.Println(fixed)

    }
    fmt.Println(a,b)
    fmt.Println(String(out))

}
...