我正在使用 ruby-jwt gem生成令牌。我不确定它是否安全?如何保护有效载荷。我尝试了不同的方法,但仍然可以破解有效载荷。
> payload = {email: "gagangami@gmail.com", token: "xyz@123"}
# Way1
> token1 = JWT.encode(payload, Rails.application.secrets.secret_key_base, 'HS256')
#=> "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImdhZ2FuZ2FtaUBnbWFpbC5jb20iLCJ0b2tlbiI6Inh5ekAxMjMifQ.l42W9P4lyP2XWXytu8qpasc6mAFg01Dg57Az1bfxgS8"
# Way 2
> rsa_private = OpenSSL::PKey::RSA.generate 2048
> rsa_public = rsa_private.public_key
> token2 = JWT.encode payload, rsa_private, 'RS256'
=> "eyJhbGciOiJSUzI1NiJ9.eyJlbWFpbCI6ImdhZ2FuZ2FtaUBnbWFpbC5jb20iLCJ0b2tlbiI6Inh5ekAxMjMifQ.U6DO9f9KZ_-GVhviACpXmuyc0dQUznPxZdCaaspr5JP36EweAuP8Wn_R2jvK2ahW0BR-RAh7Z9ChyIk94tDjasSbUYdoW_re299RB-ZmS0NVpCEa-g20sT-5JKCTwbD25vXYdxM4E0swQ81sKw35H5T8ZXSHsrE4bP5mA-me_Wli3hyGacb5O3esStPMdRC5r20qCoK7QW7Wl7NnZHLYjIn8k7lxsFmheNyl1l3OSLY92bxGkSyx4lom6bWqEMXSFdLWqPdKTOX9RZbNVi_6fGms79W6XXnb29htqkM1Z1h0RLXzjCODbALpa7At88xWr32IkHzwNxRJ28VAOJB3Qw"
如果我尝试在没有秘密的情况下手动解码JWT令牌,则会产生错误。工作良好。
但是,如果我将标记token1
和token2
粘贴在https://jwt.io/上方,则可以看到有效载荷。这是安全的方法还是Bug?供参考,我附上两个屏幕截图。
答案 0 :(得分:1)
JWT不是用于加密,而是用于标识。
JWT生成器使用私有密钥对有效负载进行了签名,您可以使用公共密钥来验证它是否由特定生成器生成。但是有效负载未加密,任何人都可以读取。
例如。 John向您发送一条消息,说“他在家”,并用他的私钥签名。每个人都可以阅读此消息,但您可以验证它是否确实是John发出的,而不是Alice之类的消息。
答案 1 :(得分:1)
任何人都可以解码,但是只有那些拥有您的秘密的人才能验证令牌。
重要的是要了解,使用JWT的目的绝不是以任何方式隐藏或遮盖数据。使用JWT的原因是为了证明发送的数据实际上是由真实来源创建的。
https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec