You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity C#加密传输账号密码至Node.js服务器的技术问询

你的问题解答

一、关于RSA加密代码的分析与适配

1. 采用的加密算法

这段C#代码使用的是RSA非对称加密算法,通过.NET的RSACryptoServiceProvider实现,第二个参数传入true,表示启用PKCS#1 OAEP填充模式(而非默认的PKCS#1 v1.5填充)。

2. 是否适用于用户名密码上传场景

用RSA加密短内容(比如用户名密码)本身是可行的,但你的当前代码存在一个关键问题:
你通过KeyContainerName存储密钥对,这种方式的密钥仅保存在本地机器的密钥容器中。而Unity客户端和Node.js服务器属于不同运行环境,密钥容器无法共享——这意味着你在本地同一机器测试时能正常加密解密,但部署到实际场景后,服务器根本无法获取客户端生成的密钥对,自然无法解密。

正确的落地方式应该是:

  • 服务器端生成RSA密钥对(公钥+私钥)
  • 将公钥下发给Unity客户端
  • 客户端用公钥加密用户名密码后发送给服务器
  • 服务器用私钥解密获取明文

3. Node.js端的解密实现

Node.js内置的crypto模块可以实现RSA解密,核心是要和Unity端的填充模式、哈希算法保持一致(Unity中OAEP默认使用SHA-1哈希,若你的.NET版本较高可能是SHA-256,需对应调整)。

示例代码如下:

const crypto = require('crypto');

// 服务器端的私钥(需为PEM格式,可通过openssl生成)
const privateKey = `-----BEGIN RSA PRIVATE KEY-----
// 替换为你的私钥内容
-----END RSA PRIVATE KEY-----`;

function decryptRSA(encryptedBase64) {
  const encryptedBuffer = Buffer.from(encryptedBase64, 'base64');
  // 解密时指定OAEP填充,哈希算法和Unity端匹配
  const decryptedBuffer = crypto.privateDecrypt(
    {
      key: privateKey,
      oaepHash: 'sha1', // 对应Unity默认的OAEP哈希算法
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
    },
    encryptedBuffer
  );
  return decryptedBuffer.toString('utf8');
}

// 使用示例
const encryptedStr = "客户端传来的Base64加密字符串";
const decryptedStr = decryptRSA(encryptedStr);
console.log(decryptedStr);

你可以用以下命令生成RSA密钥对:

# 生成私钥
openssl genrsa -out private.key 2048
# 从私钥导出公钥
openssl rsa -in private.key -pubout -out public.key

之后将公钥转换成Unity支持的XML格式(RSACryptoServiceProvider可直接导入XML公钥),替换你代码中密钥容器的逻辑即可。

二、SHA256代码的问题修复

你的SHA256代码出错的核心原因:循环时误用了循环变量i,而非哈希数组的元素hash[i],导致输出的不是哈希值而是循环索引的十六进制。

修复后的代码:

SHA256 sha256 = SHA256Managed.Create();
byte[] bytes = System.Text.Encoding.UTF8.GetBytes("randy");
byte[] hash = sha256.ComputeHash(bytes);

// 生成十六进制格式的哈希字符串
string hexResult = "";
for (int i = 0; i < hash.Length; i++)
{
    hexResult += String.Format("{0:x2}", hash[i]); // 这里要使用hash[i]而非i
}
Debug.Log("hex hash: " + hexResult);

// 生成Base64格式的哈希字符串
string base64Result = Convert.ToBase64String(hash);
Debug.Log("base64 hash: " + base64Result);

修复后,输入"randy"的十六进制哈希结果应为7c4a8d09ca3762af61e59520943dc26494f8941b,Base64结果为fEqNCco3Yq9h5ZUglD3CZJT4lBs=

内容的提问来源于stack exchange,提问作者user3648673

火山引擎 最新活动