using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace FineUIPro.Web.HSSE.Hazard
{
public partial class ToHazard : PageBase
{
public string url
{
get
{
return (string)ViewState["url"];
}
set
{
ViewState["url"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
url = BuildRedirectUrl(CurrUser.Account);
}// 密钥(与Java完全一致)
private const string SECRET_B64 = "y3KXl9sle7+WUpwyVajCyx8LyQdZSwUUgVS69FDvuR8=";
// 登录接口地址
private const string API_LOGIN = "https://hse-ai.cwcec.com/api/auth/unified-login";
///
/// 构建统一登录跳转URL(C#版,与Java逻辑完全一致)
///
/// 用户名
/// 加密签名字符串
public static string BuildRedirectUrl(string username)
{
// 1. Base64 解码密钥
byte[] key = Convert.FromBase64String(SECRET_B64);
// 2. 生成时间戳(秒)、随机nonce
long ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
string nonce = Guid.NewGuid().ToString("N"); // 去掉横杠,与Java一致
// 3. 构建JSON明文
string json = $"{{\"username\":\"{username}\",\"timestamp\":{ts},\"nonce\":\"{nonce}\"}}";
// 4. AES-CBC-PKCS7 加密(Hutool默认:随机IV,输出 = IV + 密文)
string data = AesCbcEncrypt(json, key);
// 5. 构建签名原文 + HMACSHA256 签名
string signPayload = $"data={data}×tamp={ts}&nonce={nonce}";
string sign = HmacSha256Sign(signPayload, key);
// 6. 构建有序参数(LinkedHashMap 对应 SortedDictionary / 手动有序)
var queryParams = new Dictionary
{
{ "data", data },
{ "timestamp", ts.ToString() },
{ "nonce", nonce },
{ "sign", sign }
};
// 7. 拼接URL(URL编码)
StringBuilder sb = new StringBuilder(API_LOGIN).Append('?');
foreach (var kvp in queryParams)
{
sb.Append(HttpUtility.UrlEncode(kvp.Key))
.Append('=')
.Append(HttpUtility.UrlEncode(kvp.Value))
.Append('&');
}
// 去掉最后一个 &
if (sb.Length > 0) sb.Length--;
return sb.ToString();
}
#region 核心加密工具方法(与Java Hutool完全对齐)
///
/// AES-CBC-PKCS7 加密
/// 输出格式:IV(16字节) + 密文 → Base64(和Hutool AES.encrypt 行为一致)
///
private static string AesCbcEncrypt(string plainText, byte[] key)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7; // 与Java PKCS5Padding 通用兼容
aes.GenerateIV(); // 自动生成随机16字节IV(和Java一致)
using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
using (var ms = new System.IO.MemoryStream())
{
// 先写入IV(Hutool默认格式:IV + 密文)
ms.Write(aes.IV, 0, aes.IV.Length);
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (var sw = new System.IO.StreamWriter(cs, Encoding.UTF8))
{
sw.Write(plainText);
}
// 输出:IV + 密文 → Base64
return Convert.ToBase64String(ms.ToArray());
}
}
}
///
/// HMACSHA256 签名(小写十六进制)
///
private static string HmacSha256Sign(string payload, byte[] key)
{
using (var hmac = new HMACSHA256(key))
{
byte[] payloadBytes = Encoding.UTF8.GetBytes(payload);
byte[] hashBytes = hmac.ComputeHash(payloadBytes);
// 转小写十六进制(与Java digestHex一致)
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
#endregion
}
}