簡體   English   中英

有沒有辦法在 node.js 中使用 GMP 庫來使用 SRP6 進行憑據

[英]Is there a way to use GMP libraries in node.js to credentials with SRP6

在搜索了一段時間后,我搜索了一種在 Node.js 中使用等效於以下 PHP 函數的方法,但我發現在我的情況下沒有任何效果:

gmp_init gmp_import gmp_powm gmp_export

這個想法是用js重寫這個php代碼:

function CalculateSRP6Verifier($username, $password, $salt)
    {
        // algorithm constants
        $g = gmp_init(7);
        $N = gmp_init('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
        
        // calculate first hash
        $h1 = sha1(strtoupper($username . ':' . $password), TRUE);
        
        // calculate second hash
        $h2 = sha1($salt.$h1, TRUE);
        
        // convert to integer (little-endian)
        $h2 = gmp_import($h2, 1, GMP_LSW_FIRST);
        
        // g^h2 mod N
        $verifier = gmp_powm($g, $h2, $N);
        
        // convert back to a byte array (little-endian)
        $verifier = gmp_export($verifier, 1, GMP_LSW_FIRST);
        
        // pad to 32 bytes, remember that zeros go on the end in little-endian!
        $verifier = str_pad($verifier, 32, chr(0), STR_PAD_RIGHT);
        
        // done!
        return $verifier;
    }

不久前我找到了我的問題的答案。 這可以在 Node.js 中使用 Buffer 和以下庫bigint-buffer<\/code> 、 big-integer<\/code>就像我在下面所做的那樣。

const bigintBuffer = require(`bigint-buffer`)
const BigInteger = require(`big-integer`)
const crypto = require(`crypto`)

/**
 *
 * @param {Buffer} salt
 * @param {string} identity
 * @param {string} password
 * @return {Buffer}
 */
function computeVerifier (salt, identity, password) {
    const hashIP = crypto.createHash(`sha1`)
        .update(identity + `:` + password)
        .digest()
    const hashX = crypto.createHash(`sha1`)
        .update(salt)
        .update(hashIP)
        .digest()
    const x = bigintBuffer.toBigIntLE(hashX)
    const g = BigInt(`0x7`)
    const N = BigInt(`0x894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7`)
    const verifier = BigInteger(g).modPow(x, N)
    const lEVerifier = verifier.value.toString(16).match(/.{2}/g).reverse().join(``)
    return Buffer.from(lEVerifier, `hex`)
}

// Test
crypto.randomBytes(32, (err, buf) => {
    if (err) throw err;
    computeVerifier(buf, `foo`, `bar`);
});

暫無
暫無

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

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