我在 GoLang 上實作的代碼片段運行良好
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"golang.org/x/crypto/pbkdf2"
)
func main() {
newPasswd := pbkdf2.Key([]byte("test"), []byte("Gare5vgHIo"), 10000, 50, sha256.New)
fmt.Println(hex.EncodeToString(newPasswd), nil)
}
我正在嘗試在 Python 上做同樣的事情
def main():
password = b'test'
salt = b'Gare5vgHIo'
iterations = 1000
key = pbkdf2_hmac("sha256", password, salt, iterations, 50)
print(key)
print(key.decode())
但是key.decode()方法會拋出一個錯誤:
UnicodeDecodeError('utf-8', b'\xd9\xb2;\x0f$\x9a\x9c\t\x91\x16\x81\xb8a\x00\xd8\xdd{e.\xa9\x7f\xe9\x92dH\xa6\x05\x16\xd8\xbb\xfdy\x13\xc5D\x1c\xa2\x93e\xbf{\\\x19\xc1\x8df\xf4\xbft\xe2', 5, 6, 'invalid start byte')
我對 Python 代碼做錯了什么?
uj5u.com熱心網友回復:
.decode()試圖通過將位元組解釋為 UTF-8 編碼資料來轉換 from bytes(str您可以將引數傳遞給它以使用不同的編解碼器,但它基本上是用于將文本資料的編碼表示轉換回str,并且隨機原始位元組不是文本的編碼表示)。UTF-8 是一種自檢編碼;隨機位元組很少通過自檢。
如果要將位元組顯示為十六進制字串,請使用:
print(key.hex())
其中bytes.hex是一種bytes直接轉換str為兩倍長度的方法,將每個位元組表示為兩個十六進制字符。
在非常舊的(3.5 之前)版本的 Python 上,bytes沒有.hex()方法,因此您需要匯入模塊并執行以下binascii操作:
print(binascii.hexlify(key))
但這對于任何當前支持的 Python 版本都不是必需的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493492.html
上一篇:Golang嵌套地圖過濾器
下一篇:Base64解碼未完成
