最近折腾小米路由器 AX3600 刷 OpenWrt,涉及 SSH 密码计算,一般教程都是给的工具,但是我怕某一天再也找不到这样的工具,就想找一下算法,结果真被我找到了,特此记录一下。
代码很简短,使用的 Python 实现:
import hashlib
# 路由器固件解包后,从 /bin/mkxqimage 中提取的盐
salt = {
'r1d': 'A2E371B0-B34B-48A5-8C40-A7133F3B5D88',
'others': 'd44fb0960aa0-a5e6-4a30-250f-6d2df50a'
}
def get_passwd(sn):
return hashlib.md5((sn + get_salt(sn)).encode('utf-8')).hexdigest()[:8]
def get_salt(sn):
if '/' not in sn:
return salt['r1d']
else:
return swap_salt(salt['others'])
def swap_salt(salt):
return '-'.join(reversed(salt.split('-')))
def main():
import sys
if len(sys.argv) < 2:
print('Usage: {} SN'.format(sys.argv[0]))
sys.exit(1)
sn = sys.argv[1]
print_line(get_passwd(sn))
def print_line(message):
print(message)
if __name__ == "__main__":
main()