- 实现了本地IM缓存功能,支持会话、消息历史和草稿的存储 - 开发了聊天界面UI组件,包含消息列表、输入框和搜索功能 - 创建了聊天相关的ViewModel,处理消息收发和状态管理 - 构建了会话列表界面,支持置顶、免打扰和删除操作 - 集成了群组功能,实现群聊管理和群设置界面 - 添加了实时消息推送和会话状态同步机制
53 行
1.8 KiB
Java
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;
|
|
}
|
|
}
|