笨办法管理密码

其实本来想起的题目是“Manage your password the hard way” —— 题注

背景

首先恭喜好莱坞一众女星(We saw your boobs )。嘛...虽然到底是怎么弄的貌似还没有定论,不过看上去已经引起了一些对密码安全的重视。

密码安全往往都会强调两点,健壮性和密码复用。强密码可以提高密码安全性,但是相对增加记忆负担,因为强密码往往是没有规律的。另外一方面,即使是强密码也会因为各种各样的情况丢失。例如暴力破解和站点被攻击从后台获得密码。如果每个账户以及站点使用不同的密码(即避免密码复用),就可以相对减少损失,不过这同样会增加记忆负担。

拿小本本记密码实在是麻烦又不安全,并且逼格一点都不高。能不能有个高端点的方法来实现?

思路

通过某种加密算法可以将一个简单的字符串变成另外一个随机字符串,这样生成出来的随机字符串是强密码。

通过两个输入(用户输入的主密码(mainkey)和基于站点的输入)决定一个输出可以避免密码复用。

主密码的长度太短可以用随机字符补长 长度太长可以通过某种映射缩短

加密算法的结果如果不全在密码可用字符范围内的话可以建立一个字符集,通过某种映射将密文转换成实际要用的密码

实际上这个东西在之前一直都在考虑。昨天微博上的一位朋友@神無转转子问到这个问题:如果说想一个简单密码再将其取hash作为密码,密码安全性会怎样?于是我说了一下我的想法

光说不练也没意思 于是我就花了半天时间用Python实现这个密码管理。

需求

便携:用户不可能只在一个终端上登陆,于是要求只要用户记住自己的主密码,无论在任何终端上,只要有这个应用,输入主密码和网站名就能获得网站密码

保存:在用户的常用终端,可以保存常用网站的设置

稳定:相同的输入(主密码和站点名)一定要是相同的输出 (要不然怎么登的进去啊喂)

多变:通过少量的修改可以生成完全不一样的一套密码

加密算法的选择

以我半吊子的数学水平,密码学是根本不想看懂的。各种加密算法我也只是当他们是黑盒子,搞清楚怎么调用就行了

简单的进行MD5、SHA等显然是不合适的,因为弱密码的碰撞很多(很多人都是用同一个弱密码),这样这些信息摘要也很有可能碰撞很多,安全性下降。

试了一下Python的RSA库,发现相同的两个输入会出现不同的输出。仔细查看源代码之后发现他库里的加密函数中间有随机值。(给跪)

其他的非对称加密算法我表示完全不了解,打算使用非对称加密的想法破灭了,于是选了一个对称加密DES。

(为啥是DES?我是随便选的)

实现

基本思路就是上图中说的那样

首先要安装DES库,pyDes这个库是纯Python实现的,只要pip一下就能安装了

pip install pyDes
easy_install pyDes

这是我的KeyManager.py文件

from pyDes import *
import random as r
import string, pickle

# Any Initial Value you want, must be 8 bytes
initialvalue = "babybear"
# Any salt you want
salt = "CuGBabyBeaR"
# Any char set you want, it should be intersection of usable char sets of all sites
charset = string.ascii_letters + string.digits + "/[email protected]#$%^&*()_+-={}|:\"<>?,./;'[]\\"

sites = []

# Generate 24 byte key by mainkey and implement triple DES object
def init(mainkey):
    global d

    r.seed(salt)

    l = len(mainkey)
    if l < 24:
        mainkey += ''.join([chr(r.randint(0,255))for x in xrange(24-l)])
    elif l > 24:
        mainkey = fence(mainkey, 24)
        mainkey = map(lambda a:chr(a%256), mainkey)

    d = triple_des(mainkey, CBC, initialvalue, pad=None, padmode=PAD_PKCS5)

# A mapping method, transform data to integer list
def fence(data,n):
    res = [0 for x in xrange(n)]

    nd, rd = divmod(len(data), n)
    for i in xrange(nd):
        for j in xrange(n):
            res[j] += ord(data[i*n + j])
    for i in xrange(rd):
        res[i] += ord(data[i-rd])

    return res

# Calculate key by site name
def getKey(name, n = 16, _charset = None):
    if not _charset:
        _charset = charset
    encrypted = d.encrypt(salt + "@" + name)
    encrypted = fence(encrypted, n)
    key = map(lambda a : _charset[a % len(_charset)], encrypted)
    return ''.join(key)

# Calculate key in saved settings
def getSiteKey(i):
    site = sites[i]
    return getKey(site['name'],site['n'],site['charset'])
    pass

# Load sites settings
def load():
    global sites
    f = open('settings','r')
    sites = pickle.load(f)
    pass

# Save sites settings
def save():
    f = open('settings','w+')
    pickle.dump(sites, f)
    pass

# Add a site setting
def addSite(name, n, _charset = None):
    if not isinstance(name,basestring):
        raise TypeError("Sitename must be sting")
    if not isinstance(n, int):
        raise TypeError("Keylength must be integer")
    if _charset and not isinstance(name,basestring):
        raise TypeError("Charset must be sting")
    sites.append({'name':name,'n':n,'charset':charset})
    pass

if __name__ == '__main__':
    mainkey = raw_input("Input your mainkey: ")
    init(mainkey)
    while True:
        name = raw_input("Input site name (or \"exit\"): ")
        if name == 'exit':
            break
        else:
            print getKey(name, 16)
        pass

这只是一个基本应用,保存站点信息的功能就不在此演示了。

只要修改全局变量salt就可以完全改变生成的密码

时间: 2024-10-25 15:05:44

笨办法管理密码的相关文章

这本Python入门畅销书《“笨办法”学python 3》,不仅仅是一本书

此前,小编分享过一篇文章<跟着数百万人编程导师学C语言!>,介绍的是泽德 A. 肖大神的新书<"笨办法"学C语言>很多用户在后台留言,<"笨办法"学Python 3>什么时候出版?今天这本书终于在六月初与大家见面啦,与作者其他的图书风格一样,<"笨办法"学Python 3>也不仅仅是一本书,随书附赠5个多小时充满激情的视频,这是一套完整的Python语言视频课程! 纯正的美式发音,中文字幕,边看边练

python笨办法解决zipfile解压会改变文件最后修改时间的问题

# -*- coding=gbk -*- import zipfile def UnZip(path, patht):     #path 为需要解压的文件路径,patht为解压的目标目录     f = zipfile.ZipFile(path, 'r')     print "开始解压文件..."     for file in f.namelist():         print "正在解压文件:%s to %s" %(file, patht)       

忘记mysql管理密码怎么办?

情况一: 在已知密码的情况下修改mysql管理密码: mysqladmin -uroot -p123 password 123456 情况二: 在忘记mysql登录密码的情况下,清空或登录mysql管理密码: 1.#停止mysqld服务 /etc/init.d/mysqld stop 2.#使用mysqld_safe启动服务器.这样启动mysql将允许任何人以root用户和空密码访问mysql服务器 #允许本和网络远程登录 /application/mysql/bin/mysqld_safe -

笨办法理解动态规划算法

动态规划在编程中有着广泛的应用,对于某些问题我们可以通过动态规划显著的降低程序的时间复杂度.本质上动态规划并不是一种算法,而是解决一类问题的思想.本篇博客通过一些非常简单而又经典的问题(比如数塔.0-1背包.完全背包.走楼梯问题.最长公共子序列等)来帮助大家理解动态规划的一般套路. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1 动态规划的基本思想 如果我们解决一个问题的时候能将一个大问题转换成一个或者若干个规模较小的同等性质的

一个新手的Python自学之旅 #MacBook #《“笨办法”学Python》#第三章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门

第三章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门 以后我都会将<“笨办法”学Python>简称为“这本书” 本人用了近5年的MacBook,但在此之前,从未使用过电脑自带的“终端Terminal”(图标:).在非程序员的世界里,建立和删除文件夹或文件,都是:鼠标右键点新建/删除,这是UI带来的便利.但是,却不知道如何利用命令行实现这些操作. 首先,要掌握几个我们平时常用,但在代码界有另外名称的名词:目录.路径.打印. --目录:我们认为它是这样的:标题:第一章:第

Python自学之旅 #新手#MacBook #《“笨办法”学Python》#第六章:常用的简易Python命令、符号、代码、格式化字符串

第六章:常用的简易Python命令.符号.代码.字符串 <“笨办法”学Python>这本书中,确实用了较多篇幅来介绍Python的一些常用简单的命令.符号.代码和字符串等,对于像我这样的自学新手,真的是非常棒,因为它们可以帮我建立接着学下去的信心和兴趣.但我在这个系列的博客当中,不打算写的这么精细,首先因为这不符合我写博的初衷和习惯,其次因为我不打算靠这写书来挣钱,最后因为我确实没有那个实力去挖掘简单东西中更深奥复杂的应用.所以,我写的这个博客,只适合像我这样的自学新手,如果想要成为大神,还是

如何解决Serv-U管理密码忘记

如何解决Serv-U管理密码忘记 2016-06-17 15:46:48 2581次 解决方法: 点击“FTP服务器”,停止FTP服务器.进入Serv-U安装目录,默认C:Program FilesServ-U.替换LocalSetupPassword=后面的字符串为gu7BF26C4E60D6B998A2ED3CE369688344.保存ServUDaemon.ini文件,再次打开“FTP服务器”并启动FTP服务器.此时管理密码已经成了:ftpadmin_ftp 打开ServUDaemon.i

OA项目13:系统模块之用户管理密码加密等

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 上节遗留了一个错误,在用户管理list.jsp页面显示岗位时这句<s:iterator value="#roles">是无法将岗位显示的,必须将#去掉便OK了. 二 密码MD5加密: 引入包:commons-codec.jar 在userAction中涉及到密码的add()方法和initPassword()方法中将设置密码的代码改

Windbg找出memory leak的一种笨办法

以下内容是转自 http://www.cnblogs.com/fbird/p/5889596.html 以前做项目碰到过一个问题,在客户的站点上面发现有严重的内存泄漏.幸运的是我们找到了重现的步骤,一轮下来大概有几十兆的泄漏,但是以下常规方法却没啥用. 用windbg把heap上面的object全部dump下来,和上一轮操作作比较,并不能发现什么有用的东西. 大对象heap上面也没啥有用的东西. 像.net memory profiler这种比较智能的工具也用不上,因为一轮操作下来已经能使工具o