确认AWS Cognito设备时为何出现salt或密码验证器负数错误?
AWS Cognito ConfirmDevice 报错:Found negative value for salt or password verifier
问题根源
错误出在long_to_hex函数的实现上,而非hash_sha256的补零逻辑。AWS Cognito要求PasswordVerifier必须是2048位无符号大整数的固定长度(512字符)十六进制字符串,若转换后的十六进制存在前导负号或长度不足,Cognito会将其解析为负数,触发该错误。
修复方案
1. 修正long_to_hex函数
替换为以下实现,确保生成符合要求的十六进制字符串:
def long_to_hex(value): # 转换为无符号十六进制(大写),去掉0x前缀 hex_str = format(value, 'X') # 补前导零至512字符(匹配2048位大整数的十六进制长度) return hex_str.zfill(512)
2. 简化哈希函数(可选)
当前hash_sha256函数的补零逻辑是冗余的(hashlib.sha256(buf).hexdigest()始终返回64个字符),可简化为:
def hash_sha256(buf): return hashlib.sha256(buf).hexdigest()
原因说明
当pow(self.g, ..., self.big_n)生成的大整数最高位为1时,部分旧的十六进制转换方法会误将其当作有符号数处理,输出带负号的结果。使用format(value, 'X')可确保生成无符号十六进制,zfill(512)则保证长度符合Cognito的2048位要求,避免解析错误。
测试验证
修改后重新运行设备确认流程,观察passwordVerifier(hex)输出是否始终为512字符的大写十六进制字符串,无负号前缀,即可解决随机报错问题。
内容的提问来源于stack exchange,提问作者Varun Gawande
相关产品推荐
相关产品推荐

