Heim >Backend-Entwicklung >Golang >Fehler aesGCMOpen hat Passwort erhalten: Nachrichtenauthentifizierung fehlgeschlagen: Golang-Entschlüsselung gcm
Ich versuche, die Rails ActiveSupport-Entschlüsselung in Golang umzuschreiben, erhalte aber diesen Fehler
err aesGCMOpen 得到密码:消息验证失败
Dies ist Rails-Code, der die Entschlüsselung aktiv unterstützt
class Crypton SECRET_KEY_BASE = ENV["SECRET_KEY_BASE"] class << self def encrypt text raise 'Encypt failed, secret_key_base not found' unless SECRET_KEY_BASE.present? text = text.to_s unless text.is_a? String len = ActiveSupport::MessageEncryptor.key_len salt = SecureRandom.hex len key = ActiveSupport::KeyGenerator.new(SECRET_KEY_BASE).generate_key salt, len crypt = ActiveSupport::MessageEncryptor.new key encrypted_data = crypt.encrypt_and_sign text "#{salt}$$#{encrypted_data}" end def decrypt text raise 'Decrypt failed, secret_key_base not found' unless SECRET_KEY_BASE.present? salt, data = text.split "$$" len = ActiveSupport::MessageEncryptor.key_len key = ActiveSupport::KeyGenerator.new(SECRET_KEY_BASE).generate_key salt, len crypt = ActiveSupport::MessageEncryptor.new key crypt.decrypt_and_verify data end end end
Dies ist mein Golang-Code, den ich versuche, ActiveSupport Rewrite von Rails zu entschlüsseln
// DecryptGCM // reference on Rails 5.2-stable: // https://github.com/rails/rails/blob/5-2-stable/activesupport/lib/active_support/message_encryptor.rb#L183 func DecryptGCM(encryptedText string, secretKeyBase string) (string, error) { encryptText := strings.Split(encryptedText, "$$") saltHex := encryptText[0] encodedText := encryptText[1] splitEncodedText := strings.Split(encodedText, "--") encodedText = splitEncodedText[0] ivText := splitEncodedText[1] authTagText := splitEncodedText[2] decodeText, err := base64.StdEncoding.DecodeString(encodedText) if err != nil { return "", fmt.Errorf(`err b64 decode text got %v`, err) } ivDecodeText, err := base64.StdEncoding.DecodeString(ivText) if err != nil { return "", fmt.Errorf(`err b64 iv got %v`, err) } authTagTextDecoded, err := base64.StdEncoding.DecodeString(authTagText) if err != nil { return "", fmt.Errorf(`err b64 auth tag got %v`, err) } key := GenerateKey(secretKeyBase, saltHex) block, err := aes.NewCipher(key) if err != nil { return "", fmt.Errorf(`err aesNewCipher got %v`, err) } aesGCM, err := cipher.NewGCM(block) if err != nil { return "", fmt.Errorf(`err chipperNewGCM got %v`, err) } plaintext, err := aesGCM.Open(nil, ivDecodeText, decodeText, authTagTextDecoded) if err != nil { return "", fmt.Errorf(`err aesGCMOpen got %v`, err) } return string(plaintext), nil } func GenerateKey(secretKeyBase string, saltHex string) []byte { key := pbkdf2.Key([]byte(secretKeyBase), []byte(saltHex), 65536, 32, sha1.New) return key } func TestMain(t *testing.T) { encryptText := "7c7eb6202943398b0d0619d008d226372f1b3b341eb39500eab71c3b67b7f641$$hDJ5e+6QkoCjk4cqT+hAY9c7Jj7Hxg==--t9hrqWnzQeeJTffr--1bHoguSmIkYQrpI1cd/KRQ==" decrypted, err := DecryptGCM(encryptText, SECRET_KEY) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Decrypted:", decrypted) } }
Der Schlüssel ist:
SECRET_KEY_BASE="3ae9b0ce19316f877554a0427044180e27267fb9798db9147feeb318865b3a52f79824201608f6e4e10dc8e3f29e5bf4b83e46c4103ff8d98b99903d054d720i"
Ich habe mit diesem Rails-Befehl verschlüsselte Daten generiert
Crypton.encrypt("hello, world")
Wenn Sie eine Lösung finden, hinterlassen Sie bitte einen Kommentar,
Danke
Kann verschlüsselte Daten aus der Rails-Verschlüsselung entschlüsseln
im Go-Code aesGCM.Open()
调用中、密文和认证标签分别在第三个和第四个参数中传递。这是错误的。两个数据必须连接并在第三个参数中传递。第四个参数需要是nil
. Dieser Parameter wird für zusätzliche Daten verwendet, die hier nicht verwendet werden.
Darüber hinaus fehlt im Go-Code die Deserialisierung entschlüsselter Daten. Hierzu muss eine entsprechende Bibliothek eingesetzt werden, wie zum Beispiel ruby-marshal.
Insgesamt sind folgende Änderungen erforderlich:
import ( "bytes" rbmarshal "github.com/dozen/ruby-marshal" ... ) ... func DecryptGCM(encryptedText string, secretKeyBase string) (string, error) { ... plaintext, err := aesGCM.Open(nil, ivDecodeText, append(decodeText, authTagTextDecoded...), nil) // Fix 1 if err != nil { return "", fmt.Errorf(`err aesGCMOpen got %v`, err) } var v string rbmarshal.NewDecoder(bytes.NewReader(plaintext)).Decode(&v) // Fix 2 return string(v), nil }
Mit diesen Änderungen können mit Rails-Code verschlüsselte Daten erfolgreich mit Go-Code entschlüsselt werden.
Das obige ist der detaillierte Inhalt vonFehler aesGCMOpen hat Passwort erhalten: Nachrichtenauthentifizierung fehlgeschlagen: Golang-Entschlüsselung gcm. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!