使用 URI 和密钥生成 HMAC SHA 算法
Generate HMAC SHA Algorithm using URI and Key
我写了一个 Java 程序来生成 HMAC SHA 散列码,但由于某些原因我不得不在 NodeJs/JavaScript 中编写相同的代码。我试着用谷歌搜索但没有得到任何东西。在此 Java 代码中,我将 URI 和 Key 作为参数传递,以生成哈希码,其中 URI 包含时间戳。
java 代码如下:
public static String calcMAC(String data, byte[] key) throws Exception {
String result=null;
SecretKeySpec signKey = new SecretKeySpec(key, SecurityConstants.HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(SecurityConstants.HMAC_SHA1_ALGORITHM);
mac.init(signKey);
byte[] rawHmac;
try {
rawHmac = mac.doFinal(data.getBytes("US-ASCII"));
result = Base64.encodeBase64String(rawHmac);
} catch (Exception e) {
e.printStackTrace();
}
return result.trim();
}
public static void main(String args[]) {
String timestamp = args[0];
String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
String out = null;
try {
out = calcMAC("/req?app_id=47ca34" + timestamp + "=2018-05-22T12:02:15Z",
key.getBytes());
System.out.println(URLEncoder.encode(out, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
是否可以在 NodeJs/JavaScript 中实现相同的目标?
注意::我必须从 Postman 预请求脚本中调用此脚本。
加密模块应该为你做这件事,你可以用你想要散列的任何东西替换 'data' 变量:
const crypto = require('crypto');
const data = 'The fault dear Brutus lies not in our stars';
const key = Buffer.from('d134hjeefcgkahvg32ajkdbaff84ff180', 'utf8');
const hash = crypto.createHmac('sha1', key).update(data).digest('base64');
const uriEncodedHash = encodeURIComponent(hash);
console.log('Hash: ' + uriEncodedHash);
对 Java 和 Node.js 中的数据进行哈希处理得到的结果(URI 编码)为:
TJJ3xj93m8bfVpGoucluMQqkB0o%3D
相同的 Java 代码为:
public static void main(String args[]) {
String data = "The fault dear Brutus lies not in our stars";
String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
String out = null;
try {
out = calcMAC(data, key.getBytes());
System.out.println(URLEncoder.encode(out, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
同样,我们可以将任何内容放入 'data' 我们想要的。
我写了一个 Java 程序来生成 HMAC SHA 散列码,但由于某些原因我不得不在 NodeJs/JavaScript 中编写相同的代码。我试着用谷歌搜索但没有得到任何东西。在此 Java 代码中,我将 URI 和 Key 作为参数传递,以生成哈希码,其中 URI 包含时间戳。 java 代码如下:
public static String calcMAC(String data, byte[] key) throws Exception {
String result=null;
SecretKeySpec signKey = new SecretKeySpec(key, SecurityConstants.HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(SecurityConstants.HMAC_SHA1_ALGORITHM);
mac.init(signKey);
byte[] rawHmac;
try {
rawHmac = mac.doFinal(data.getBytes("US-ASCII"));
result = Base64.encodeBase64String(rawHmac);
} catch (Exception e) {
e.printStackTrace();
}
return result.trim();
}
public static void main(String args[]) {
String timestamp = args[0];
String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
String out = null;
try {
out = calcMAC("/req?app_id=47ca34" + timestamp + "=2018-05-22T12:02:15Z",
key.getBytes());
System.out.println(URLEncoder.encode(out, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
是否可以在 NodeJs/JavaScript 中实现相同的目标?
注意::我必须从 Postman 预请求脚本中调用此脚本。
加密模块应该为你做这件事,你可以用你想要散列的任何东西替换 'data' 变量:
const crypto = require('crypto');
const data = 'The fault dear Brutus lies not in our stars';
const key = Buffer.from('d134hjeefcgkahvg32ajkdbaff84ff180', 'utf8');
const hash = crypto.createHmac('sha1', key).update(data).digest('base64');
const uriEncodedHash = encodeURIComponent(hash);
console.log('Hash: ' + uriEncodedHash);
对 Java 和 Node.js 中的数据进行哈希处理得到的结果(URI 编码)为:
TJJ3xj93m8bfVpGoucluMQqkB0o%3D
相同的 Java 代码为:
public static void main(String args[]) {
String data = "The fault dear Brutus lies not in our stars";
String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
String out = null;
try {
out = calcMAC(data, key.getBytes());
System.out.println(URLEncoder.encode(out, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
同样,我们可以将任何内容放入 'data' 我们想要的。