【问题标题】:Ruby RSA from exponent and modulus strings来自指数和模数字符串的 Ruby RSA
【发布时间】:2019-08-08 05:56:10
【问题描述】:

我有一个 RSA 公钥模数和指数字符串。

我想用这两个字符串创建一个OpenSSL::PKey::RSA

基本上它们是:

  • n = '长字符串'
  • e = '4 个字符的字符串'

我将如何在 Ruby 中做到这一点? 最终目标是将其发送到JWT gem。

更新

我目前使用的是 Ruby 2.3.1,所以这可行:

key = OpenSSL::PKey::RSA.new
key.e = OpenSSL::BN.new(Base64.decode64(e), 2)
key.n = OpenSSL::BN.new(Base64.decode64(n), 2)

但是,它在升级期间不起作用。

【问题讨论】:

  • 您的更新在任何情况下都可以通过使用Base64.urlsafe_decode64 而不是Base64.decode64 用于旧的ruby 版本。

标签: ruby rsa


【解决方案1】:

我是这样工作的,基于这个 python 实现:

https://github.com/jpf/okta-jwks-to-pem/blob/master/jwks_to_pem.py

    key = OpenSSL::PKey::RSA.new
    exponent = kid_header['e']
    modulus = kid_header['n']


    # Voila !
    key.set_key(base64_to_long(modulus), base64_to_long(exponent), nil)

    def base64_to_long(data)
      decoded_with_padding = Base64.urlsafe_decode64(data) + Base64.decode64('==')
      decoded_with_padding.to_s.unpack('C*').map do |byte|
        to_hex(byte)
      end.join.to_i(16)
    end

    def to_hex(int)
      int < 16 ? '0' + int.to_s(16) : int.to_s(16)
    end

【讨论】:

  • 太完美了!
【解决方案2】:

对于 Ruby 2.4+,您应该使用:

key = OpenSSL::PKey::RSA.new
key.set_key(n, e, d)

如果您没有d,您可以将其设置为nil

【讨论】:

    【解决方案3】:

    你可以使用JSON::JWT gem (https://rubygems.org/gems/json-jwt, https://github.com/nov/json-jwt)

    # can be found somewhere in `.well-known` space on the server
    key_hash = {
      "kty": "RSA",
      "use": "sig",
      "kid": ...,
      "e": ...,
      "n": ...,
      "alg": "RS256"
    }
    jwk = JSON::JWK.new(key_hash)
    JSON::JWT.decode token, jwk.to_key
    # voila!
    

    同样可以使用 Ruby JWT(https://rubygems.org/gems/jwt, https://github.com/jwt/ruby-jwt/blob/master/lib/jwt/jwk/rsa.rb)实现

    public_key = JWT::JWK::RSA.import(key_hash).public_key
    JWT.decode token, public_key, true, { algorithm: key_hash[:alg] }
    

    【讨论】:

    • 万一有人像我一样挣扎... JWK 支持仅在 2.2.1 版本上添加到 jwt-ruby 中注意您在项目中使用的版本(我使用的是 1.5)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多