Skip to content
Nov Matake edited this page Feb 27, 2018 · 7 revisions

JSON Web Encryption (JWE)

Encrypting

Call JSON::JWT#encrypt(key, algorithm, encryption_method).

When the given key is a JSON::JWK instance, and it has kid, then generated JSON::JWE instance has the same kid value in its header automatically.

public_key = OpenSSL::PKey::RSA.new <<-PEM
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAx9vNhcvSrxjsegZAAo4OEuoZOV/oxINEeWneJYczS80/bQ1J6lSS
 :
-----END RSA PUBLIC KEY-----
PEM

jwe = jwt.encrypt(public_key, :'RSA-OAEP', :A256GCM)

Decrypting

JSON::JWT.decode(jwe_string, key) is for decoding and decrypting compact-seiralized JWE token.

After decryption, JSON::JWE#plain_text will return original input as String.

Usually the plain text is also a JWT/JWS token, so you'll need decode it.

private_key = OpenSSL::PKey::RSA.new <<-PEM
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzHEJiUJDN59jUomP1pl7r0AGKXJAgR2DjmBTbN4kpvjWqcRR
 :
-----END RSA PRIVATE KEY-----
PEM

jwe = JSON::JWT.decode 'eyJ...', private_key
jwe.plain_text # => 'eyJ..'

jws = JSON::JWT.decode jwe.plain_text, :skip_verification

You can explicitly specify expected enc & alg.
If you didn't specify the alg, this gem automatically detect it from given JWT header and class of given public key / secret instance.

jwe = JSON::JWT.decode 'eyJ...', private_key, :'RSA-OAEP', :A256GCM 

You can also decode without decryption, then decrypt it later.

jwe = JSON::JWT.decode 'eyJ...', :skip_decryption
jwe.plain_text # => nil

jwe.decrypt! private_key
jwe.plain_text # => 'eyJ..'

Serialization

Follow JWT's Serialization section.

jwe = jwt.encrypt(public_key)
jwe.to_s # => "eyJ..."

Supported Algorithms

Key Encryption Algorithms

These values are supported as key encryption algorithms.

  • RSA1_5 (default)
  • RSA-OAEP
  • dir
  • A128KW
  • A256KW

These are not supported.

  • ECDH-ES
  • ECDH-ES+A128KW
  • ECDH-ES+A256KW

For each algorithm details, read [RFC7518] JSON Web Algorithms (JWA).

Content Encryption Algorithms

These values are supported as content encryption algorithms.

  • A128GCM (default)
  • A256GCM
  • A128CBC-HS256
  • A256CBC-HS512

A192CBC-HS384 is not supported.

For each algorithm details, read [RFC7518] JSON Web Algorithms (JWA).

Key Representation

Follow JWS's Key Representation section.

Clone this wiki locally