【问题标题】:JWT for Android with secret key带有密钥的 Android 版 JWT
【发布时间】:2023-04-04 17:34:01
【问题描述】:

我必须使用 SHA-256 算法和密钥(例如“blablablamysecretkey”)获取 JWT。

尽管检查了 SO,但有几个库及其文档我还不知道如何执行此操作。

如果我使用这个库https://github.com/jwtk/jjwt(最常用的之一),这是代码示例:

Key key = MacProvider.generateKey();
String s = Jwts.builder().setSubject("stringtoencode").signWith(SignatureAlgorithm.HS512, key).compact();

由于我必须使用 SHA-256 算法,我想我应该使用:

Key key = MacProvider.generateKey();
String s = Jwts.builder().setSubject("stringtoencode").signWith(SignatureAlgorithm.HS256, key).compact();

我的问题是这个示例(以及我顺便看到的所有示例)使用 Key key = MacProvider.generateKey();,如果我没记错,这会生成一个通用密钥。事实上,这就是文档所说的:

// We need a signing key, so we'll create one just for this example. Usually
// the key would be read from your application configuration instead.

所以我的问题是如何将我的密钥(字符串)转换为 Key 类的东西?

【问题讨论】:

    标签: android jwt


    【解决方案1】:

    MacProvider.generateKey() 生成一个随机密钥,这比使用密码更安全。密钥需要随机选择。如果您想知道如何生成 hmac 密钥,请阅读这篇文章https://security.stackexchange.com/questions/95972/what-are-requirements-for-hmac-secret-key

    // 我们需要一个签名密钥,所以我们将为此示例创建一个。通常 // 键将从您的应用程序配置中读取。

    您突出显示的文本意味着您必须将密钥保留在服务器中,以便在客户端发送令牌时验证 JWT 签名。 HMAC 密钥是对称的,密钥用于签名和验证

    如果您想从密码短语String 生成Key,请使用

    byte hmacKey[] = passphrase.getBytes(StandardCharsets.UTF8);
    Key key = new SecretKeySpec(hmacKey,signatureAlgorithm.getJcaName());
    

    【讨论】:

    • MacProvider.generateKey* 方法已经正确生成密钥。这些方法的调用者不需要担心这一点。此外,您的 hmacKeyString.getBytes() 示例不正确。结果,您将获得特定于平台的字节,而您的意思可能是getBytes(StandardCharsets.UTF8);。但即使这样也可能是不正确的——如果存储为字符串,大多数安全随机密钥都是 Base64 编码的。您不需要获取 base64 字符串本身的字节 - 您需要先对其进行 base64 解码,得到的解码字节是实际的密钥。
    • @LesHazlewood,我同意您的评论,但 OP 专门询问 我如何将我的密钥(字符串)转换为 Key 类的东西 密钥是一个字符串未在 base64 中编码
    • 是的,虽然您在回答中从技术上展示了如何根据 OP 的问题将普通的 'ol 字符串转换为 SecretKeySpec,但这并不意味着 OP 实际上应该这样做,它是不警告他们安全问题是危险的。根据JWA RFC specification, Section 3.2,如果您分别使用 HS256、HS384 或 HS512,HMAC 签名密钥必须>= 32、48 或 64 字节长。根据规范要求,“blablablamysecretkey”不是有效的 JWT 密钥,使用较短的密钥长度可能很危险。
    • 您好,您从哪里获得 signatureAlgorithm 从 signatureAlgorithm.getJcaName()?
    • @DarkLeonhart,例如使用SignatureAlgorithm.HS256.getJcaName()
    猜你喜欢
    • 2016-10-09
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2015-05-10
    • 2013-04-06
    相关资源
    最近更新 更多