Ubuntu 17.10认证流程改造:集成PIN验证功能技术问询
嘿,针对你在Ubuntu 17.10里集成PIN验证的需求,我来逐个拆解你的问题,给你实际可行的思路:
1. 能否编写获取登录界面输入的认证字符串的脚本?
直接写脚本抓取登录界面的输入不太现实——Ubuntu 17.10默认用LightDM作为显示管理器,登录输入是由特权级的LightDM模块处理的,普通脚本没法直接拦截。不过你可以通过**PAM(Pluggable Authentication Modules)**这个Linux认证核心框架来介入:不管是登录界面还是终端会话,所有认证请求都会走PAM流程,你可以通过自定义PAM逻辑来获取并处理用户输入的认证字符串。
2. 能否修改Ubuntu现有脚本?若可以,需修改哪些脚本?
可以,但非常不建议直接修改系统默认的脚本/配置(系统更新后很容易被覆盖)。更合理的方式是通过PAM的扩展能力来添加你的逻辑,不过如果你想了解相关的系统配置文件:
- 终端会话的PAM配置:
/etc/pam.d/login(本地终端)、/etc/pam.d/sshd(SSH登录) - LightDM登录界面的PAM配置:
/etc/pam.d/lightdm - 系统全局通用认证配置:
/etc/pam.d/common-auth、/etc/pam.d/common-password
推荐的做法是用pam_exec模块(PAM的执行模块)调用你的自定义脚本,只需要在对应的PAM配置文件里添加一行规则,就能把你的认证逻辑接入到系统流程中,完全不需要修改原有脚本。
3. 能否将系统底层密码加密机制用于PIN?
当然可以!这其实是最优方案——Ubuntu用户密码存在/etc/shadow里,用的是crypt系列加密算法(默认SHA-512),你可以直接复用这套成熟的机制:
- 设置PIN时:用
mkpasswd命令(或C语言的crypt()函数)对PIN进行加密,把加密后的结果存在一个自定义的安全文件里(比如/etc/shadow.pin,权限设为0600,只有root可读) - 认证时:把用户输入的字符串用同样的盐值和加密算法处理,同时对比
/etc/shadow里的加密密码和自定义文件里的加密PIN,只要其中一个匹配就通过认证
这种方式既利用了系统经过验证的加密安全性,又不用自己从零实现加密逻辑,风险低得多。
4. 若不可行,如何着手编写用于存储及恢复PIN与密码的加密算法?
如果真的有特殊原因不能复用系统crypt机制(非常不推荐这么做),可以参考以下思路实现:
- 存储环节:
- 选用带认证的强加密算法,比如AES-256-GCM(既能加密又能防止数据被篡改)
- 不要硬编码密钥,用用户的主密码通过密钥派生算法(比如Argon2或PBKDF2)生成加密密钥,一定要加入随机盐值
- 存储加密后的PIN时,同时保存盐值、加密密文和GCM模式的认证标签
- 验证环节:
- 读取存储的盐值,用用户输入的主密码重新派生密钥
- 要么用密钥解密PIN后对比,要么直接把输入的PIN加密后和存储的密文对比
- 关键注意事项:
- 存储PIN的文件必须严格控制权限(比如仅root可读),避免泄露
- 每个用户的PIN使用独立的随机盐值,防止彩虹表攻击
- 密钥派生过程要设置足够高的计算成本(比如Argon2调整内存和迭代次数),抵御暴力破解
额外补充:PIN暂停逻辑的实现
你提到的“不匹配则暂停PIN功能,直至成功认证”,可以这样做:
- 维护一个状态文件(比如
/var/run/pam_pin_lock),记录每个用户的PIN锁定状态 - 在PAM认证逻辑里,当输入的PIN和密码都不匹配时,标记该用户的PIN为锁定状态
- 当用户用正确密码完成一次成功认证后,清除该用户的锁定标记,恢复PIN功能
内容的提问来源于stack exchange,提问作者Miladiouss




