簡體   English   中英

在JavaScript中計算HMAC:從Java轉換

[英]Calculating HMAC in JavaScript : converting from Java

我在Java中有一個加密功能,試圖將其轉換為Javascript,由於某種原因,最終生成的哈希值不相同。

我正在為Javascript使用加密貨幣,為Java而使用Mac。

Javascript

    const time = 0,0,0,0,0,8,21,60;
    const signKey = 20,54,50,82;

    const hash = crypto
       .createHmac('sha1', new Buffer(signKey, 'base64'))
       .update(new Buffer(time))
       .digest('hex');

    console.log(`hash ${hash}`);

Java的

    byte[] time = 0,0,0,0,0,8,21,60;
    byte[] signKey = 20,54,50,82;
     SecretKeySpec signKey = new SecretKeySpec(signKey, "HmacSHA1");

    Mac mac;
    mac = Mac.getInstance("HmacSHA1");
    mac.init(signKey);
    byte[] hash = mac.doFinal(time);

Javascript-輸出

hash = 52,56,48

Java-輸出hash = [-47, 30, -1]

我想我缺少在Javascript中進行某些轉換的方法,但是由於我不熟悉加密技術,因此我不確定。

謝謝 !

正如我在JS中看到的那樣,您將signKey視為base64編碼的字符串,而在Java中則將其視為字節數組。 因此,從JS代碼中刪除'base64'應該會有所幫助。

嗨,我設法找到了解決方案,所以是的,確實的一件事是從JS代碼中刪除了base64和Buffers,而且我應該摘要而不將其轉換為十六進制。

由於我刪除了緩沖區,由於加密僅接受緩沖區,TypedArrays,String和DataViews,所以我不得不將兩個數組都轉換為TypedArrays。

之后,我應該將哈希轉換為Unit32Array,並且應該與Java代碼中的哈希相同

因此,最后的代碼是:

         const timeInBytes = 0,0,0,0,0,8,21,60;
         const combinedSecret = 20,54,50,82;

         const signKey = Uint8Array.from(combinedSecret);
         const time = Uint8Array.from(timeInBytes);

         const hash = crypto
            .createHmac('sha1', signKey)
            .update(time)
            .digest();

        const encodedArray = Uint32Array.from(hash);

感謝大伙們 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM