Не удается заставить Python следовать в кодировке base32 - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь повторить кодировку base32 хэша sha256 из go в python.Я пытаюсь повторить логику, с помощью которой kube-router создает имена ipset для политики пространства имен namespace-network: https://github.com/cloudnativelabs/kube-router/blob/736757d942f173e19566eea0a512dfa819699126/pkg/controllers/netpol/network_policy_controller.go#L1476

Я просто не могу заставить python выдавать тот же вывод base32.Я, вероятно, делаю что-то явно неправильно.Помогите!

Go Code:

package main

import (
    "fmt"
    "crypto/sha256"
    "encoding/base32"
)

func main() {
    namespace := "my-ns"
    policyName := "default-deny"

    chksum := sha256.Sum256([]byte(namespace + policyName))
    fmt.Printf("%x\n", chksum)
    fmt.Println(base32.StdEncoding.EncodeToString(chksum[:]))
    fmt.Println(base32.StdEncoding.EncodeToString([]byte("abc")))
}

, запускающий эти выходы:

dd684919ef4a1362b841409f5255ec963bd53d353804114779c4e6d66641eb28
3VUESGPPJIJWFOCBICPVEVPMSY55KPJVHACBCR3ZYTTNMZSB5MUA====
MFRGG===

Python Code:

#!/usr/bin/env python

import hashlib
import base64

namespace = "my-ns"
policyName = "default-deny"

sha256 = hashlib.sha256()
sha256.update(namespace+policyName)
chksum = sha256.hexdigest()
print chksum
print base64.b32encode(chksum)
print base64.b32encode(bytearray("abc"))

, выполняющий эти выходы:

dd684919ef4a1362b841409f5255ec963bd53d353804114779c4e6d66641eb28
MRSDMOBUHEYTSZLGGRQTCMZWGJRDQNBRGQYDSZRVGI2TKZLDHE3DGYTEGUZWIMZVGM4DANBRGE2DONZZMM2GKNTEGY3DMNBRMVRDEOA=
MFRGG===

Первые строки вывода в каждой согласны, что хорошо.Позвольте мне знать, что контрольная сумма sha256 вычисляется одинаково для каждой стороны.Вторая строка в каждой не совпадает, я не понимаю, почему - я пробовал много разных приведений chksum в коде python безрезультатно.Третья строка в каждой просто предполагает, что кодирование простой строки base32, кажется, работает с обеих сторон.

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

На стороне Python вы получаете хеш-код SHA256 в шестнадцатеричном формате, а затем base32 - шестнадцатеричные цифры.Чтобы исправить это, используйте следующее:

sha256 = hashlib.sha256()
sha256.update(namespace+policyName)
chksum = sha256.digest() # Get hash as byte string
print chksum.encode('hex') # Convert byte string to hexadecimal for printing
print base64.b32encode(chksum)
print base64.b32encode(bytearray("abc"))
0 голосов
/ 08 июня 2019

Версия go не является base32, кодирующей шестнадцатеричную версию дайджеста.Он кодирует необработанную форму.Вы печатаете шестнадцатеричную форму по-разному на каждой стороне.

...