代码之家  ›  专栏  ›  技术社区  ›  HexBlit

Microsoft JScript运行时错误对象不支持此属性或方法

  •  3
  • HexBlit  · 技术社区  · 16 年前

    所以我试图在我的javascript中调用这个函数,但它给了我一个错误:“Microsoft JScript运行时错误对象不支持这个属性或方法”,我不明白为什么。它在调用hmacobj.gethmac时发生。这来自JSSHA网站: http://jssha.sourceforge.net/ 使用HMAC-SHA1算法加密。谢谢您!

    hmacObj = new jsSHA(signature_base_string,"HEX");
    
    signature = hmacObj.getHMAC(signature_key,"HEX","SHA-1","HEX");
    

    在此之上,我复制了sha.js中的代码

    片段:

    function jsSHA(srcString, inputFormat) {
    
     /*
      * Configurable variables. Defaults typically work
      */
     jsSHA.charSize = 8; // Number of Bits Per character (8 for ASCII, 16 for Unicode)
     jsSHA.b64pad  = ""; // base-64 pad character. "=" for strict RFC compliance
     jsSHA.hexCase = 0; // hex output format. 0 - lowercase; 1 - uppercase
    
     var sha1 = null;
     var sha224 = null;
    

    它正在调用的函数(在JSSHA函数内部)

    this.getHMAC = function (key, inputFormat, variant, outputFormat) {
            var formatFunc = null;
            var keyToUse = null;
            var blockByteSize = null;
            var blockBitSize = null;
            var keyWithIPad = [];
            var keyWithOPad = [];
            var lastArrayIndex = null;
            var retVal = null;
            var keyBinLen = null;
            var hashBitSize = null;
    
            // Validate the output format selection
            switch (outputFormat) {
            case "HEX":
                formatFunc = binb2hex;
                break;
            case "B64":
                formatFunc = binb2b64;
                break;
            default:
                return "FORMAT NOT RECOGNIZED";
            }
    
            // Validate the hash variant selection and set needed variables
            switch (variant) {
            case "SHA-1":
                blockByteSize = 64;
                hashBitSize = 160;
                break;
            case "SHA-224":
                blockByteSize = 64;
                hashBitSize = 224;
                break;
            case "SHA-256":
                blockByteSize = 64;
                hashBitSize = 256;
                break;
            case "SHA-384":
                blockByteSize = 128;
                hashBitSize = 384;
                break;
            case "SHA-512":
                blockByteSize = 128;
                hashBitSize = 512;
                break;
            default:
                return "HASH NOT RECOGNIZED";
            }
    
            // Validate input format selection
            if ("HEX" === inputFormat) {
                // Nibbles must come in pairs
                if (0 !== (key.length % 2)) {
                    return "KEY MUST BE IN BYTE INCREMENTS";
                }
                keyToUse = hex2binb(key);
                keyBinLen = key.length * 4;
            } else if ("ASCII" === inputFormat) {
                keyToUse = str2binb(key);
                keyBinLen = key.length * jsSHA.charSize;
            } else {
                return "UNKNOWN KEY INPUT TYPE";
            }
    
            // These are used multiple times, calculate and store them
            blockBitSize = blockByteSize * 8;
            lastArrayIndex = (blockByteSize / 4) - 1;
    
            // Figure out what to do with the key based on its size relative to
            // the hash's block size
            if (blockByteSize < (keyBinLen / 8)) {
                if ("SHA-1" === variant) {
                    keyToUse = coreSHA1(keyToUse, keyBinLen);
                } else {
                    keyToUse = coreSHA2(keyToUse, keyBinLen, variant);
                }
                // For all variants, the block size is bigger than the output size
                // so there will never be a useful byte at the end of the string
                keyToUse[lastArrayIndex] &= 0xFFFFFF00;
            } else if (blockByteSize > (keyBinLen / 8)) {
                // If the blockByteSize is greater than the key length, there will
                // always be at LEAST one "useless" byte at the end of the string
                keyToUse[lastArrayIndex] &= 0xFFFFFF00;
            }
    
            // Create ipad and opad
            for (var i = 0; i <= lastArrayIndex; i++) {
                keyWithIPad[i] = keyToUse[i] ^ 0x36363636;
                keyWithOPad[i] = keyToUse[i] ^ 0x5C5C5C5C;
            }
    
            // Calculate the HMAC
            if ("SHA-1" === variant) {
                retVal = coreSHA1(keyWithIPad.concat(strToHash), blockBitSize + strBinLen);
                retVal = coreSHA1(keyWithOPad.concat(retVal), blockBitSize + hashBitSize);
            } else {
                retVal = coreSHA2(keyWithIPad.concat(strToHash), blockBitSize + strBinLen, variant);
                retVal = coreSHA2(keyWithOPad.concat(retVal), blockBitSize + hashBitSize, variant);
            }
    
            return (formatFunc(retVal));
        };
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   HexBlit    16 年前

    所以我发现,当我演示对象时,它并没有在其中创建实际的函数。通过一些调整,我能够让它出现,并且能够调用函数。

    还注意到调用object.gethmac(string、string、string、string)并不总是理解您的字符串与它的函数兼容。感谢所有帮助过的人。(约翰•肖恩)