Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JWT用于Android,具有密钥_Android_Jwt - Fatal编程技术网

JWT用于Android,具有密钥

JWT用于Android,具有密钥,android,jwt,Android,Jwt,我必须使用SHA-256算法和一个秘密密钥(例如“BlablabullyseCretKey”)获得一个JWT 尽管如此,一些图书馆和他们的文档我还不知道如何执行这一点 如果我使用这个库(最常用的库之一),这是代码示例: Key key = MacProvider.generateKey(); String s = Jwts.builder().setSubject("stringtoencode").signWith(SignatureAlgorithm.HS512, key).compact(

我必须使用SHA-256算法和一个秘密密钥(例如“BlablabullyseCretKey”)获得一个JWT

尽管如此,一些图书馆和他们的文档我还不知道如何执行这一点

如果我使用这个库(最常用的库之一),这是代码示例:

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=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.

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

MacProvider.generateKey()
生成一个随机密钥,这比使用密码短语更安全。钥匙需要随机选择。如果您想知道如何生成hmac密钥,请阅读本文

//我们需要一个签名密钥,因此我们将仅为本例创建一个签名密钥。通常 //密钥将从应用程序配置中读取

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

如果要从密码短语
字符串生成
,请使用

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特别询问如何将我的密钥(字符串)转换为密钥类的内容。密钥是一个没有用base64编码的字符串是,虽然您在回答中从技术上展示了如何根据OP的问题将普通的“ol”字符串转换为
SecretKeySpec
,但这并不意味着OP实际上应该这样做,不警告他们安全问题是危险的。根据,如果分别使用HS256、HS384或HS512,则HMAC签名密钥的长度必须大于等于32、48或64字节。根据规范要求,“BlablaBlamAllimySecretKey”不是有效的JWT密钥,使用较短的密钥长度可能会有危险。您好,您从signatureAlgorithm.getJcaName()哪里获得signatureAlgorithm的?@DarkLeonhart,例如使用
signatureAlgorithm.HS256.getJcaName()