离线验证签名的数据保险库

问题描述 投票:1回答:1

我正在向客户端发送一个public_key和一个有效载荷以及一个签名。

我正在尝试使用public_key和有效负载来验证客户端上的签名,但是我找不到找到验证数据的方法。不论我在做什么,每次我收到的错误答复都是。

我正在使用保管库对有效负载进行签名

  def sign(box_identifier, data) do
       Vaultex.Client.write("transit/sign/#{box_identifier}",
                     %{ 
                        input: data,
                        hash_algorithm: "sha2-256"
                      },
                     @authentication_strategy,
                     {@token})
  end

  Vault.Transit.sign("coucou", Base.encode64("test"))

   _____________________________________________________________
   digest = OpenSSL::Digest::SHA256.new
   key = OpenSSL::PKey::RSA.new File.read 'key.pem'       

   key.public_key.verify digest, signature, "test"


-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzj0qLxEc0Qu9g9nxdMRe
jBaUD0+GuQITiAPEDOrjScJTznJrR9hXqO14BqepuEmcz4irv4hEkBEBfqZ1XnP9
2fc9zG4A20lepqDRwPhkEdI4D71KRPSxv/a+O2HrAhTYH17NbsYDtpkFCdepC6FC
01aso679d3kAZiZ+GD2OLDWifreBVPE2aXacJYXZZ4kTkchsevY3PnAcOG4LmM6b
kUoF1qfP6tJ/VItJXyqSC2PI9Io28zFhwOf6cPLEQCBCTNCNwHunqHW8olcE/Xfn
b2toym0/UvW3kH/P4h+TE1ZoCV5FWwcx9hcAy1TC0zm4D5Xwt0/4Pgj1GiXFGOY4
WKGyuDK8gs7QsSDqu+B5p0xiDg7226bpplVxR/P87CohYTtYZj/lO03G2ZEj3pCr
/juxThdzTgO5xUcPV5GFbPjlK1TIIb5XVZZzW6+sviB6cYZ5T/Xp9dtbR8G9Zt9n
gLlaKU7U/DDQxRv2uiCZy5U/DUpfxY56r4Y73Ir2YgmZY1PKLC2a5/w3wScVZILN
fnxnVYOzSPPaKxAJWbZsZjxXJS0veE8RgGFHgWfe8+qPCEnx81Jf2NzupQHO1KIk
UnlYGcPESk/90psDNsmISSdtF2D6j4k28k0ncViTu2eMKBX81W8TgTeHtQa3zR0S
upN2o25b3Wi2oQU14kTdOCcCAwEAAQ==
-----END PUBLIC KEY-----

我是否还可以在由保管库签名时脱机验证签名?

ruby elixir hashicorp-vault
1个回答
0
投票

是,可以脱机验证签名。我的回答是要提到一些Ruby细节,因为直到我开始进行更多研究之后,我才注意到这是Elixir。

默认情况下,当使用RSA密钥签名时,保险柜使用PSS算法进行签名。 PSS上的verify方法需要OpenSSL::PKey::PKeyPKCS #1 v1.5有关两者的利弊的一些有用信息。

除了此算法差异之外,您还需要从保管箱返回的签名中删除PKCS #1 v1.5

下面是一些示例Ruby代码进行签名,然后验证签名:

Here's

看起来像Ruby 2.5,有一个新的vault:v1:

transit_key = "test_key"
message = "test"

# Returns something like:
# vault:v1:B3reNpf8e/WyAYzBzyWz3oSUM...
signature = Vault.logical.write(
        "transit/sign/#{transit_key}/sha2-256",
        input: Base64.encode64(message),
        signature_algorithm: "pkcs1v15"
    ).data[:signature]

signature = signature.split(":")[2]

# Gives us the PEM encoded public key
# -----BEGIN PUBLIC KEY-----
# ...
public_key = Vault.logical.read("transit/keys/#{transit_key}").data[:keys][:"1"][:public_key]
public_key = OpenSSL::PKey::RSA.new(public_key)

digest = OpenSSL::Digest::SHA256.new

puts public_key.verify(digest, Base64.decode64(signature), message) # returns true
puts public_key.verify(digest, Base64.decode64(signature), message + "modified") # returns false
© www.soinside.com 2019 - 2024. All rights reserved.