如何正确验证用户输入的随机挑战响应密码与预设PIN匹配?
问题分析与解决方案
核心问题
你的代码存在三个关键错误导致验证失败:
- 类型不匹配:用户输入的
pwdEntry是字符串类型,每个字符是str;而randNumbers存储的是整数类型,直接比较str和int永远不相等。 - 显示映射错误:你定义的
random_to_digit把随机数转成了无关字符显示,但需求中应该直接展示随机数本身(比如例子里的RAN是1、2、3这类数字,用户输入对应数字即可)。 - 验证逻辑硬编码:验证时直接固定使用索引5-9,没有利用预设的
pin列表,既不灵活也容易出错。
修正后的代码
import random # 存储预设PIN pin = [5, 6, 7, 8, 9] # 生成0-9每个数字对应的1-3随机数 randNumbers = [random.randint(1, 3) for _ in range(10)] # 输出PIN行 print("PIN:", end=' ') for i in range(10): print(i, end=' ') # 输出随机数行,直接打印随机数本身 print("\nRAN:", end=' ') for num in randNumbers: print(num, end=' ') # 获取用户输入 pwdEntry = input("\nPlease enter your converted password: ") # 验证逻辑:遍历预设PIN,逐个匹配对应随机数 success = True for idx, digit in enumerate(pin): # 将随机数转为字符串,与用户输入的对应字符比较 if str(randNumbers[digit]) != pwdEntry[idx]: success = False break print("success" if success else "failure")
修改说明
- 移除了多余的
random_to_digit映射,直接输出randNumbers中的随机数,符合需求的显示逻辑。 - 验证时通过
pin列表动态获取每个数字对应的随机数索引,将随机数转为字符串后与用户输入比较,解决类型不匹配问题。 - 用循环替代硬编码的多条件判断,代码更灵活,修改
pin列表后无需改动验证逻辑。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

