如何防止使用Sikuli输入密码时发生窗口切换?
解决Sikuli+PuTTY自动登录时的密码泄露风险问题
嘿,这个密码泄露的风险确实戳中了自动化登录的安全痛点——毕竟SSO的核心就是不暴露密码,窗口切换导致密码“串台”到记事本这类程序太危险了。我给你几个实际可行的解决方案,按安全性和易用性排序:
1. 彻底抛弃密码输入:用SSH密钥+PuTTY/Plink实现无密码登录
这是最优解,从根源上消除模拟输入密码的风险:
- 先给远程UNIX服务器配置SSH公钥认证:用PuTTYgen工具生成一对SSH密钥,把公钥上传到服务器的
~/.ssh/authorized_keys文件中。 - 在PuTTY中保存带密钥的会话:进入PuTTY的
Connection -> SSH -> Auth选项,指定私钥文件(.ppk格式),然后保存这个会话。 - 之后Sikuli只需启动PuTTY并加载该会话即可:
openApp("putty.exe -load \"你的会话名称\"") - 更省心的方式是用PuTTY的命令行工具
plink.exe,直接在脚本里调用:
全程不用碰密码字段,自然不存在泄露风险。run("plink.exe -ssh username@你的服务器地址 -i C:/path/to/你的私钥文件.ppk")
2. 限制Sikuli输入时的窗口焦点,防止串台
如果暂时没法用密钥,那就要严格控制密码输入的上下文:
- 强制锁定PuTTY窗口焦点:输入密码前,先确保PuTTY是当前激活窗口,用Sikuli的
App类实现:putty_app = App("PuTTY") if not putty_app.isFocused(): putty_app.focus() wait(1) # 短暂等待确保窗口激活 # 校验窗口标题匹配(比如包含"Password:"关键词) if putty_app.focusedWindow().title().contains("PuTTY"): type("你的加密后密码") else: popup("检测到非PuTTY窗口激活,已终止密码输入!") - 临时禁用窗口切换快捷键:用Python的
ctypes调用Windows API,暂时禁用Alt+Tab、Win键这类切换热键,输入完成后再恢复:
注意:一定要加异常处理,确保脚本出错时也能恢复快捷键,避免影响用户正常操作。import ctypes # 注册热键禁用Alt+Tab ctypes.windll.user32.RegisterHotKey(None, 1, 0x0001, 0x09) # 执行密码输入 type("你的加密后密码") # 恢复快捷键 ctypes.windll.user32.UnregisterHotKey(None, 1)
3. 用PuTTY密钥代理Pageant实现SSO
Pageant是PuTTY自带的密钥代理工具,加载私钥后,所有PuTTY/Plink连接都会自动用它完成认证:
- 提前把私钥加载到Pageant(可设置开机自动加载,用加密密钥保护)。
- Sikuli只需启动PuTTY并连接服务器,Pageant会自动完成认证,全程无需输入密码:
if not App("pageant.exe").running(): run("pageant.exe C:/path/to/你的私钥文件.ppk") wait(2) openApp("putty.exe username@你的服务器地址")
4. 极端情况:加密密码+严格图像匹配
如果以上方案都没法落地,只能模拟输入密码,那至少要做这些防护:
- 不要在脚本里明文存储密码,用加密方式保存,运行时动态解密(比如用Python的
cryptography库实现)。 - 精确匹配PuTTY的密码输入框:截取密码输入框的图像,用
find("password-input-box.png")确认它在屏幕上且处于激活状态,再执行输入。 - 输入时监控窗口焦点,一旦PuTTY失去焦点,立刻停止输入(可借助Sikuli的
onAppDeactivated事件实现)。
内容的提问来源于stack exchange,提问作者Varun Gupta
相关产品推荐
相关产品推荐

