Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat aesGCMOpen mendapat kata laluan: Pengesahan mesej gagal: penyahsulitan golang gcm

Ralat aesGCMOpen mendapat kata laluan: Pengesahan mesej gagal: penyahsulitan golang gcm

王林
王林ke hadapan
2024-02-06 08:05:031054semak imbas

错误 aesGCMOpen 得到密码:消息身份验证失败:golang 解密 gcm

Kandungan soalan

Saya cuba menulis semula rails activesupport penyahsulitan ke golang tetapi mendapat ralat ini

err aesGCMOpen 得到密码:消息验证失败

Ini adalah kod rel yang menyokong penyahsulitan secara aktif

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

Ini adalah kod golang saya yang saya cuba menyahsulit penulisan semula activesupport dari rel

// 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)
    }
}

Kuncinya ialah:

SECRET_KEY_BASE="3ae9b0ce19316f877554a0427044180e27267fb9798db9147feeb318865b3a52f79824201608f6e4e10dc8e3f29e5bf4b83e46c4103ff8d98b99903d054d720i"

Saya menjana data yang disulitkan daripada arahan rails ini

Crypton.encrypt("hello, world")

Jika anda menemui sebarang penyelesaian sila tinggalkan komen,

Terima kasih

Boleh menyahsulit data yang disulitkan daripada penyulitan rel


Jawapan yang betul


dalam kod Go aesGCM.Open()调用中、密文和认证标签分别在第三个和第四个参数中传递。这是错误的。两个数据必须连接并在第三个参数中传递。第四个参数需要是nil. Parameter ini digunakan untuk data tambahan yang tidak digunakan di sini.
Selain itu, penyahserikatan data yang dinyahsulit tiada daripada kod Go. Untuk ini, perpustakaan yang sesuai mesti digunakan, seperti ruby-marshal.

Secara keseluruhan, perubahan berikut diperlukan:

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
}

Dengan perubahan ini, data yang disulitkan menggunakan kod Rails boleh berjaya dinyahsulit menggunakan kod Go.

Atas ialah kandungan terperinci Ralat aesGCMOpen mendapat kata laluan: Pengesahan mesej gagal: penyahsulitan golang gcm. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam