XuqmGroup-Server/common/src/main/java/com/xuqm/common/security/AppRequestSignatureUtil.java
XuqmGroup bc329ec566 feat(chat): 添加聊天界面和会话管理功能
- 实现了本地IM缓存功能,支持会话、消息历史和草稿的存储
- 开发了聊天界面UI组件,包含消息列表、输入框和搜索功能
- 创建了聊天相关的ViewModel,处理消息收发和状态管理
- 构建了会话列表界面,支持置顶、免打扰和删除操作
- 集成了群组功能,实现群聊管理和群设置界面
- 添加了实时消息推送和会话状态同步机制
2026-04-27 23:41:58 +08:00

53 行
1.8 KiB
Java

package com.xuqm.common.security;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
public final class AppRequestSignatureUtil {
private static final String HMAC_ALG = "HmacSHA256";
private AppRequestSignatureUtil() {
}
public static String payload(String appId,
String userId,
String nickname,
String avatar,
long timestamp,
String nonce) {
return normalize(appId) + '\n'
+ normalize(userId) + '\n'
+ normalize(nickname) + '\n'
+ normalize(avatar) + '\n'
+ timestamp + '\n'
+ normalize(nonce);
}
public static String sign(String secret, String payload) {
try {
Mac mac = Mac.getInstance(HMAC_ALG);
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), HMAC_ALG));
byte[] digest = mac.doFinal(payload.getBytes(StandardCharsets.UTF_8));
return Base64.getUrlEncoder().withoutPadding().encodeToString(digest);
} catch (Exception e) {
throw new IllegalStateException("Failed to sign app request", e);
}
}
public static boolean matches(String secret, String payload, String expectedSignature) {
String actual = sign(secret, payload);
return MessageDigest.isEqual(
actual.getBytes(StandardCharsets.UTF_8),
normalize(expectedSignature).getBytes(StandardCharsets.UTF_8)
);
}
private static String normalize(String value) {
return value == null ? "" : value;
}
}