小米路由器 SSH 密码计算算法

最近折腾小米路由器 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()