- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在实现 OpenID Connect 代码流,并且在使用 javax.crypto.Mac 生成 HMACSHA-256 签名时如何使用客户端 key 作为 key 有点困惑。我不知道如何将客户端 ID 转换为 key 字节。
import org.apache.commons.codec.Charsets;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class HMACSigner {
public static final String HMACSHA256 = "HmacSHA256";
public String createSignature(final String messageToSign, final String clientSecret) {
// How do I convert the client secret to the key byte array?
SecretKeySpec secretKey = new SecretKeySpec(clientSecret.getBytes(Charsets.UTF_8), HMACSHA256);
try {
Mac mac = Mac.getInstance(HMACSHA256);
mac.init(secretKey);
byte[] bytesToSign = messageToSign.getBytes(Charsets.US_ASCII);
byte[] signature = mac.doFinal(bytesToSign);
return Base64.encodeBase64URLSafeString(signature);
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
catch (InvalidKeyException e) {
throw new RuntimeException(e);
}
}
}
按照https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-signature-17#appendix-A处的示例进行操作,我创建了以下测试用例。我的输出是 ZekyXWlxvuCN9H8cuDrZfaRa3pMJhHpv6QKFdUqXbLc
。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class HMACSignerTest {
private HMACSigner sut;
@Test
public void should_create_signature_according_to_spec() {
sut = new HMACSigner();
String signature = sut.createSignature("eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow");
assertEquals("dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk", signature);
}
}
最佳答案
key 似乎是 Base64 编码的:
SecretKeySpec secretKey = new SecretKeySpec(Base64.decodeBase64(clientSecret), HMACSHA256);
关于java - OpenID 连接 (JWS) : Using client secret as HMACSHA-256 key for verifying ID Token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793219/
我有旧代码,想在 .NET Standard 2.0 中使用它。我找到了 System.Security.Cryptography.HMACSHA1 并且我知道如何计算哈希但我不知道如何进行签名。如何
现在我正在使用此代码生成 JWT token (我正在使用 jjwt lib),这是我的小型代码示例: package com.dolphin.soa.post; import io.jsonwebt
我正在实现 OpenID Connect 代码流,并且在使用 javax.crypto.Mac 生成 HMACSHA-256 签名时如何使用客户端 key 作为 key 有点困惑。我不知道如何将客户端
我是一名优秀的程序员,十分优秀!