CryptoJS 是否可以进行二进制散列?
Is binary hashing possible with CryptoJS?
我想使用类似于 SpeakEasy
的 java 脚本创建一个 HOTP 客户端
以上库用于服务器端java脚本使用,它使用 NodeJS。
我想在浏览器的前端 javascript 上做同样的事情,但我无法使用 CryptoJS 来实现此行为。
var key = "abc";
var counter = "123";
// create an octet array from the counter
var octet_array = new Array(8);
var counter_temp = counter;
for (var i = 0; i < 8; i++) {
var i_from_right = 7 - i;
// mask 255 over number to get last 8
octet_array[i_from_right] = counter_temp & 255;
// shift 8 and get ready to loop over the next batch of 8
counter_temp = counter_temp >> 8;
}
// There is no such class called as Buffer on Browsers (its node js)
var counter_buffer = new Buffer(octet_array);
var hash = CryptoJS.HmacSHA1(key,counter_buffer);
document.write("hex value "+ hash);
document.write("hash value "+ CryptoJS.enc.Hex.stringify(hash));
我知道这在 java (android) 或 objective c (ios) 这样的原生平台上是可能的
这是相应的实现 HOTP in Objective C 但我怀疑是否可以在基于 Web 的前端上执行此操作。
此外,我非常怀疑这样的事情在浏览器中是否安全,因为 java脚本可以从任何浏览器查看。任何输入建议都会很有用。我这样做是为了 POC。我很好奇有没有人在基于网络的平台上使用过Hotp。
代码中没有这种支持二进制数据字符串的语言。您需要将二进制数据编码为某种格式,例如 Hex 或 Base64,然后让 CryptoJS 将其解码为它自己的内部二进制格式,然后您可以将其传递给各种 CryptoJS 函数:
var wordArrayFromUtf = CryptoJS.enc.Utf8.parse("test");
var wordArrayFromHex = CryptoJS.enc.Hex.parse("74657374"); // "test"
var wordArrayFromB64 = CryptoJS.enc.Base64.parse("dGVzdA=="); // "test"
其他函数有:
wordArrayFromHex.toString(CryptoJS.enc.Utf8) // "test"
CryptoJS.enc.Utf8.stringify(wordArrayFromB64) // "test"
如果您将字符串传递给 CrypoJS 函数(此处不是这些),它将被假定为 Utf8 编码的字符串。如果你不想这样,你需要自己解码。
http://caligatio.github.io/jsSHA/ 处的代码适用于 SHA-512
。
删除 .js 文件,查看它们的 test/test.html 第 515 行。它对您来说可能看起来像一个字符串,但它是二进制十六进制。
所以他们的输入是二进制的,这是没有错误的。不要因为它是一个大字符串而挂断电话。
我想使用类似于 SpeakEasy
的 java 脚本创建一个 HOTP 客户端以上库用于服务器端java脚本使用,它使用 NodeJS。
我想在浏览器的前端 javascript 上做同样的事情,但我无法使用 CryptoJS 来实现此行为。
var key = "abc";
var counter = "123";
// create an octet array from the counter
var octet_array = new Array(8);
var counter_temp = counter;
for (var i = 0; i < 8; i++) {
var i_from_right = 7 - i;
// mask 255 over number to get last 8
octet_array[i_from_right] = counter_temp & 255;
// shift 8 and get ready to loop over the next batch of 8
counter_temp = counter_temp >> 8;
}
// There is no such class called as Buffer on Browsers (its node js)
var counter_buffer = new Buffer(octet_array);
var hash = CryptoJS.HmacSHA1(key,counter_buffer);
document.write("hex value "+ hash);
document.write("hash value "+ CryptoJS.enc.Hex.stringify(hash));
我知道这在 java (android) 或 objective c (ios) 这样的原生平台上是可能的 这是相应的实现 HOTP in Objective C 但我怀疑是否可以在基于 Web 的前端上执行此操作。
此外,我非常怀疑这样的事情在浏览器中是否安全,因为 java脚本可以从任何浏览器查看。任何输入建议都会很有用。我这样做是为了 POC。我很好奇有没有人在基于网络的平台上使用过Hotp。
代码中没有这种支持二进制数据字符串的语言。您需要将二进制数据编码为某种格式,例如 Hex 或 Base64,然后让 CryptoJS 将其解码为它自己的内部二进制格式,然后您可以将其传递给各种 CryptoJS 函数:
var wordArrayFromUtf = CryptoJS.enc.Utf8.parse("test");
var wordArrayFromHex = CryptoJS.enc.Hex.parse("74657374"); // "test"
var wordArrayFromB64 = CryptoJS.enc.Base64.parse("dGVzdA=="); // "test"
其他函数有:
wordArrayFromHex.toString(CryptoJS.enc.Utf8) // "test"
CryptoJS.enc.Utf8.stringify(wordArrayFromB64) // "test"
如果您将字符串传递给 CrypoJS 函数(此处不是这些),它将被假定为 Utf8 编码的字符串。如果你不想这样,你需要自己解码。
http://caligatio.github.io/jsSHA/ 处的代码适用于 SHA-512
。
删除 .js 文件,查看它们的 test/test.html 第 515 行。它对您来说可能看起来像一个字符串,但它是二进制十六进制。
所以他们的输入是二进制的,这是没有错误的。不要因为它是一个大字符串而挂断电话。