我有下面的代码在node.js工作,我试图转换它,使API调用直接从我的flutter应用程序,但我有问题的RSA加密。
import fetch from "node-fetch";
import nodeRSA from "node-rsa";
const KEYVER = '23'
const ID = '123456789123456789'
const PRIVATE_KEY = "vvkmlkmmvcmemmcmdmdmm.......cddncndndncn ="
generateRequestHeader(){
const hashString = `${ID}\n{Date.now().toString()}\n{KEYVER}\n`;
const signer = new nodeRSA(PRIVATE_KEY, "pkcs1");
const signature = signer.sign(hasString);
const sign_enc = signature.toString("base64");
return {
"AUTH_SIGNATURE": sign_enc,
"TIMESTAMP": Date.now().toString(),
"ID": ID,
"KEY_VERSION":KEYVER
};
}
async function callAPI(){
const options = {
method: 'GET',
headers: generateRequestHeader()
};
const response = await fetch(url, options);
return response;
}
字符串
Node.js中的身份验证工作正常,但我似乎找不到一个包来复制它在flutter中。我被推荐 fast_rsapackage:
#fast_rsa: ^3.4.6
import 'package:fast_rsa/fast_rsa.dart';
class Signature{
String Id = 'c93e7094-327b-4ff3-bf2e-c52f29a8277f';
String privateKey = "ABCDEG....Z=";
String keyVer = '23.0';
generateRequestHeaders() async {
String timeStamp = DateTime.now().toString();
String hashString = "${Id}\n${timeStamp}\n${keyVer}\n";
var signer = await RSA.convertPrivateKeyToPKCS1(privateKey);
var signature = await RSA.signPKCS1v15(signer, Hash.SHA256, privateKey);
var signature_enc = await RSA.base64(signature);
return {
"AUTH_SIGNATURE": signature_enc,
"TIMESTAMP": timeStamp,
"ID": Id,
"KEY_VERSION": keyVer,
};
}
Future<dynamic> rsaRequest() async {
var options = {'method': 'GET', 'headers': generateRequestHeaders()};
String url = 'https://api.........';
http.Response response = await http.get(url, headers: options);
try {
if (response.statusCode == 200) {
print(response.body);
var document = parse(response.body);
return document;
} else {
return "failed";
}
} catch (exp) {
print(exp);
return "failed";
}
}
}
型
但是服务器总是返回 auth_error。
如何在flutter中直接使用 .js 函数?
2条答案
按热度按时间fcg9iug31#
我关注签名部分。NodeJS代码使用RSA创建签名。对于填充和摘要,应用node-rsa默认值:PKCS#1v1.5填充和SHA 256,s。这里。私钥作为DER编码的PKCS#1密钥(Base64编码)导入。签名是Base64编码的。
请注意,在问题中发布的NodeJS代码中,关于
hashString
的第二个和第三个变量的$
符号丢失,这可能是一个复制/粘贴错误。这必须得到修复,否则签名会有所不同!在Dart方面,需要进行以下修复:
RSA.signPKCS1v15()
,即RSA.convertPrivateKeyToPKCS1()
调用将被删除。RSA.signPKCS1v15()
期望PEM编码的键,即添加页眉和页脚,并且在Base64编码的主体中,每64个字符后有一个换行符。DateTime.now().millisecondsSinceEpoch.toString()
。RSA.signPKCS1v15()
返回已经base64编码的签名,即必须删除RSA.base64()
调用。一个可能的dart对应的fast_rsa库可以解决上述问题:
字符串
试验项目:
由于PKCS#1 v1.5的签名是确定性的,因此 * 相同 * 的输入数据提供了 * 相同 * 的签名。这使得检查两个代码的功能等价性变得容易。如果两个代码中使用了相同的时间戳(例如,注解掉的
1649917884089
),则两个代码返回相同的签名(nRuX6eY+66Ca2ZbB/ZK6ealRdS8gYJ4UKNwUOdJySqujGnwpflE8aZ45L4PfQK3qAMJh02o0SVG8uy2Mz+BFpg==
),这证明了两个代码的等价性。这是用于测试的固定NodeJS代码。它与问题中发布的NodeJS代码基本相同:
型
7qhs6swi2#
你可以使用https://pub.dev/packages/encrypt包在dart和flutter中执行
RSA
加密和解密。字符串