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




