一个基本的JavaScript字符串比较问题
我在使用Node.js及其内置的一个基本的JavaScript字符串比较问题,javascript,node.js,string,Javascript,Node.js,String,我在使用Node.js及其内置的crypto模块进行字符串比较时遇到了一个问题(在对传入负载进行签名检查的上下文中)。考虑这个代码示例: console.log(` SIG:'${signature}'-type:${typeof signature} 哈希:'${hmac.digest('hex')}'-type:${typeof(hmac.digest('hex'))} 等于:${signature==hmac.digest('hex')} `); 这是我在控制台中看到的: SIG :
crypto
模块进行字符串比较时遇到了一个问题(在对传入负载进行签名检查的上下文中)。考虑这个代码示例:
console.log(`
SIG:'${signature}'-type:${typeof signature}
哈希:'${hmac.digest('hex')}'-type:${typeof(hmac.digest('hex'))}
等于:${signature==hmac.digest('hex')}
`);
这是我在控制台中看到的:
SIG : '1406f5bfc078fa6a7feb5eca9c091a19c96926f6110272c04cd4cbd712be60c4' - type: string
HASH : '1406f5bfc078fa6a7feb5eca9c091a19c96926f6110272c04cd4cbd712be60c4' - type: string
EQUALS: false
因此,正如预期的那样,两者都是字符串,并且都是相同的字符串。但为什么他们不平等呢?我束手无策
顺便说一下,当使用==
时,作为比较的结果,我还得到了false
有关信息和h/t:我使用此脚本作为基础:
尝试使用
var EQUALS = SIG.localeCompare(HASH);
尝试使用
var EQUALS = SIG.localeCompare(HASH);
出现此问题是因为您调用了两次
hmac.digest()
,第二次它返回空字符串:
尝试将结果保存在变量中,然后比较:
const result=hmac.digest('hex'))
console.log(`
SIG:'${signature}'-type:${typeof signature}
哈希:'${result}'-type:${typeof(result)}
等于:${signature==result}
`);
出现此问题是因为您调用了hmac.digest()
两次,第二次它返回空字符串:
尝试将结果保存在变量中,然后比较:
const result=hmac.digest('hex'))
console.log(`
SIG:'${signature}'-type:${typeof signature}
哈希:'${result}'-type:${typeof(result)}
等于:${signature==result}
`);
您是否尝试在运行时调试?@Deniz您所说的在运行时调试是什么意思?为了获得更好的可视化表示,请执行${JSON.stringify(signature)}
和${JSON.stringify(hmac.digest('hex'))}
。它可能会显示一些隐藏的字符…比较长度。也许有一些看不见的字符,比如@trincot saidNice idea来检查长度!hmac.digest('hex')
返回0
!当我把它的输出分配给一个变量时,它会按预期工作。不知道为什么,但它起作用了。你试过在运行时调试吗?@Deniz你说在运行时调试是什么意思?为了更好的视觉表现,请执行${JSON.stringify(signature)}
和${JSON.stringify(hmac.digest('hex'))}
。它可能会显示一些隐藏的字符…比较长度。也许有一些看不见的字符,比如@trincot saidNice idea来检查长度!hmac.digest('hex')
返回0
!当我把它的输出分配给一个变量时,它会按预期工作。不知道为什么,但它起作用了。确切地说,OP的代码段中定义了SIG
在哪里?SIG只是一个字符串。语法高亮显示失败了,OP的代码段中定义了SIG
,确切地说,SIG只是一个字符串。语法高亮显示失败了,就是这个!感谢您澄清hmac.digest('hex')
的重复使用。就是这个!感谢您澄清hmac.digest('hex')
的重复使用。