对市面上的random password管理器不是很放心,还是自己写一个来的安心。

生成器:

#!/usr/bin/python
import random,sys

SPECIAL='~_+`-=!@#$%^&*(){}|\][:;<>,.?/'
PRINT='asdfghjklqwertyuiopzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'

def get_next(s):
    return s[random.randrange(0, len(s))]

length=15
if (len(sys.argv) ==2): length=int(sys.argv[1])
p=''
for i in range(length):
    if random.random() > 0.8:
        p += get_next(SPECIAL)
    else:
        p += get_next(PRINT)
print ''
print p
print ''

管理器

#!/usr/bin/python
import os, sys, keyring, getpass, subprocess, shlex

cmd_dir = os.path.dirname(sys.argv[0])
tmp_file = '%s/pwtmp' % (cmd_dir)
option = ''
if len(sys.argv) > 1:
    option = sys.argv[1]

passwd = keyring.get_keyring().get_password("masterpw","sma").encode('ascii')
enc_cmd='openssl aes-256-cbc -a -salt -in %s -out %s/pw.enc -pass pass:%s' % (tmp_file, cmd_dir, passwd)
dec_cmd='openssl aes-256-cbc -d -a -salt -in %s/pw.enc -pass pass:%s' % (cmd_dir, passwd)
dec_cmd_file='openssl aes-256-cbc -d -a -salt -in %s/pw.enc -out %s -pass pass:%s' % (cmd_dir, tmp_file, passwd)

def my_exec(cmd):
    args = shlex.split(cmd)
    p = subprocess.Popen(args)
    ret = p.wait()
    if ret != 0:
        raise "Failed to exec %s" % cmd

if option != 'edit':
    p = subprocess.Popen(shlex.split(dec_cmd), stdout=subprocess.PIPE)
    for l in p.stdout.readlines():
        l = l.strip()
        if option:
            if l.lower().find(option) >= 0: print l
        else:
            print l
elif option == 'edit':
    my_exec(dec_cmd_file)
    my_exec('vi ' + tmp_file)
    my_exec(enc_cmd)
    my_exec('rm ' + tmp_file)
    my_exec('scp %s/pw.enc shawnma.com:' % cmd_dir)