V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
gno23x
V2EX  ›  奇思妙想

我想自己实现一个“密码管理器”

  •  
  •   gno23x · 2014-12-26 13:18:56 +08:00 · 6300 次点击
    这是一个创建于 3407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想自己造个“密码管理器”的轮子,通过Web实现,不考虑类似LastPass的自动填充的功能,只用于存储密码。

    我初步设想是这样的:

    - 只需要记住一个密码,暂且称之为“last pass”好了。
    - “last pass”通过PBKDF2函数生成一个key,这个key用于AES加密,这个key我们称之为“PBKDF2 key”
    - “PBKDF2 key”用来加密(使用AES算法)另一个key,这个“另一个key”我们用来加密(也是使用AES算法)我们在各个网站的登录密码(或其它需要加密的密码),“另一个key”我们称为“password key”
    - 需要一个密码(比如GitHub的登录密码)的时候,输入“last pass”,通过PBKDF2函数得到“PBKDF2 key”,然后用“PBKDF2 key”去解密加密后的“password key”,最后通过解密得到的“password key”去解密我们存储的密码
    - 全站https

    除了密码管理以外,还有一个想整合进去的功能,就是为每个网站生成一个唯一的用户名,增加社工的成本。

    不知道这个设计有没有缺陷,想听下大家的看法。 :)
    第 1 条附言  ·  2014-12-27 13:37:48 +08:00
    感谢 @silver @endoffight 提醒,才知道 KeePass 有Android客户端,已经打消自己设计一个“密码管理器”的想法了。谢谢各位提供的建议。
    46 条回复    2014-12-30 13:05:39 +08:00
    4everLoveU
        1
    4everLoveU  
       2014-12-26 13:31:41 +08:00
    不太懂,唯一的疑问就是密码输入框输入的不都是暗文吗?你怎么知道用户输入的是“last pass”?
    gno23x
        2
    gno23x  
    OP
       2014-12-26 13:33:57 +08:00
    @4everLoveU 存储的密码都是加密过的,用户输入了“last pass”后能解密得到需要的密码,用户输入的“last pass”就是正确的。具体的加解密流程看我的描述。
    tojoevan
        3
    tojoevan  
       2014-12-26 13:44:28 +08:00
    应该属于非对称加密方法吧,可以度娘下,有很多。
    lsmgeb89
        4
    lsmgeb89  
       2014-12-26 13:51:46 +08:00
    你不觉得很麻烦吗?LastPass 这种,都不需要输,直接快捷键或者自动输了。
    nicai000
        5
    nicai000  
       2014-12-26 13:54:12 +08:00
    我一直在用自己的密码管理器
    gno23x
        6
    gno23x  
    OP
       2014-12-26 13:56:08 +08:00
    @lsmgeb89 嗯嗯,可以理解为实现一个LastPass出来。用自己电脑的话,密码是可以通过浏览器记住的,并且很多网站登录态都可以维持一段时间,所以从“密码管理器”中复制一下密码也不算太费事。

    就是不想用LastPass,没有原因。
    gno23x
        7
    gno23x  
    OP
       2014-12-26 13:56:33 +08:00
    @nicai000 可以分享一下设计思路不?
    9hills
        8
    9hills  
       2014-12-26 14:00:08 +08:00
    不如用这个,每次动态计算。。也不用去存
    http://flowerpassword.com/
    gno23x
        9
    gno23x  
    OP
       2014-12-26 14:18:31 +08:00
    @9hills 貌似这个暴力破解的成本比较低?我知道你用的是“花密”,一般你用于qq密码的代号就极有可能是qq,“记忆密码”一般还是比较简单,比较容易穷举出来。(当然,这个容易是相对的,也不是特指穷举qq的密码)
    tt7
        10
    tt7  
       2014-12-26 15:24:15 +08:00   ❤️ 1
    @gno23x 如果把花密的算法改成使用者提供呢? 对于普通用户而言, 可以在后台提供多种算法, 选择加密算法的算法由用户提供, 提供的方式可以很简单, 比如回答一系列问题, 或者画一个自定义的图形。
    wadezhao
        11
    wadezhao  
       2014-12-26 15:47:40 +08:00
    keepass是开源的,直接用人家久经考验的算法不好么……………………


    自己造个外观漂亮的界面就好。
    wolfan
        12
    wolfan  
       2014-12-26 15:50:58 +08:00
    我觉得可以改造花密将记忆码设为一个固定值,区码改为自动获取DNS主域段。自动完成应该也不错。
    KiseXu
        13
    KiseXu  
       2014-12-26 15:53:50 +08:00 via Android
    @wolfan 花密的chrome扩展就是这样的
    omegaga
        14
    omegaga  
       2014-12-26 15:57:37 +08:00
    @gno23x 看上去就是1password的思路,不过为什么要多一层password key呢?是为了使每一个密码都有独立的AES加密的密钥吗?这样的好处是什么?
    gno23x
        15
    gno23x  
    OP
       2014-12-26 16:00:58 +08:00
    @tt7 如果是自己用的话,自己搞一套算法的话相对就没那么容易被暴力破解了。问题就是如果算法因为服务器入侵啥的被知道了,就和花密一样了。因为是自己用的,所以考虑得比较极端,哈哈。总的来说,你这个思路还是足够安全的。
    gno23x
        16
    gno23x  
    OP
       2014-12-26 16:04:12 +08:00
    @wadezhao KeePass使用C#写的,你说的造个界面是GUI吗?可是它无法跨平台。
    gno23x
        17
    gno23x  
    OP
       2014-12-26 16:08:31 +08:00
    @omegaga 如果只是用“PBKDF2 key”(“last pass”通过PBKDF2函数生成)去加密我们存储的密码的话,那如果你要修改“last pass”的话,就必须解密所有已存储的的密码,然后再用新的“PBKDF2 key”去加密。

    有了“password key”后,我们修改“last pass”后,只需要用新的“PBKDF2 key”重新加密一下“password key”就行了。

    :)
    gno23x
        18
    gno23x  
    OP
       2014-12-26 16:10:12 +08:00   ❤️ 1
    @omegaga 上面还没说完,所有密码用的都是同一个“password key”,这个“password key”用“PBKDF2 key”加密。
    zix
        19
    zix  
       2014-12-26 17:29:53 +08:00
    目前在Linux、Windows都是用keepassx,觉得还是挺不错的,看了下,keepassx也支持Mac os
    zix
        20
    zix  
       2014-12-26 17:30:47 +08:00
    @zix 不过是本地存储来着……当然我用Dropbox在不同平台上同步
    gno23x
        21
    gno23x  
    OP
       2014-12-26 17:40:16 +08:00
    @zix KeePass通过Mono平台可以在OS X下使用,不过毕竟不是原生UI,会有一些小问题。而且用KeePass的话,人不在电脑旁的话,需要密码怎么办?
    9hills
        22
    9hills  
       2014-12-26 17:48:27 +08:00
    @gno23x 穷举说的简单。。求穷举

    huami算法,你现在获取我在一个叫 cracker 的论坛的加密密码是:K3945b18c8426F51。这个论坛我明确告诉你,我用的代号就是cracker

    求穷举我的密码,谢谢
    9hills
        23
    9hills  
       2014-12-26 17:51:31 +08:00
    @gno23x 花密用的HMAC算法,这个计算性能你是能算出来的,然后算下每小时能穷举多少个组合,就知道穷举是不太可能了。。

    假如我选择了Bcrypt,那更是没戏。。
    gno23x
        24
    gno23x  
    OP
       2014-12-26 17:53:01 +08:00
    @9hills 上面说了考虑得比较极端,如果cracker论坛没有任何防刷机制的话,你的密码比较短且不复杂的话,穷举还是有可能的。 :)
    9hills
        25
    9hills  
       2014-12-26 17:55:09 +08:00
    @gno23x 已经和cracker没关系了吧。我在cracker论坛的密码你都知道了

    huami本质是一个算法
    Z = huami(X, Y)

    现在你知道了Z是K3945b18c8426F51,Y是cracker,求X

    你是可能穷举,那可以试试。。
    geew
        26
    geew  
       2014-12-26 18:05:02 +08:00
    @9hills http://flowerpassword.com/app/web 看到评论
    "万一哪天花密宕机了怎么办"
    gno23x
        27
    gno23x  
    OP
       2014-12-26 18:06:22 +08:00
    @9hills

    纯数字,8位,一年时间,每秒需要试3.17个密码。
    英文数字混合的话,8位,一年时间,每秒试89456.8个密码。

    如果只有一个密码的话,这个密码当然会设置得相对复杂,所以穷举成本确实蛮高。

    实际上我也没仔细算过这个成本,所以我上面保守得说了“考虑得比较极端”,也提了“容易是相对的”。

    :)
    9hills
        28
    9hills  
       2014-12-26 18:38:55 +08:00 via iPhone
    @geew (´-ω-`) 我还写了个cli版本的,本地用
    fityme
        29
    fityme  
       2014-12-26 19:17:53 +08:00
    写了个离线版alfred的workflow,能自动复制到剪切板。。。
    然后我自己没在用(还没买正版alfred...
    wadezhao
        30
    wadezhao  
       2014-12-26 19:25:28 +08:00
    @gno23x 我的意思就是加密算法用现成的就好了,如果你想做一个应用,精力多放在界面和易用性上就好。
    hiboshi
        31
    hiboshi  
       2014-12-26 20:33:53 +08:00
    @gno23x keepass会生成 本地数据文件,是加密的,如果放心直接云端。
    KentY
        32
    KentY  
       2014-12-26 21:42:32 +08:00 via iPhone   ❤️ 1
    我从写了自己的密码管理器一直用,5,6年了。但不是web的。
    https://github.com/sk1418/passwdmanager
    gno23x
        33
    gno23x  
    OP
       2014-12-27 00:16:36 +08:00
    @hiboshi 同步是没问题,关键是没有KeePass,就没法看内容。在外面,只有手机的情况下就没法要到密码了。
    @KentY 没电脑在身边就没办法了吧。
    shepherd
        34
    shepherd  
       2014-12-27 03:30:03 +08:00
    @gno23x 一直在用黑莓上的密码管理器,重要一点的账号基本上都是不同密,强度足够,而且定期更换。
    有段时间有过一个想法,就是设计一个跟工行电子密码器类似的便携设备,主要功能就跟1Password一类的密码管理软件类似,既方便携带,又能保证一定安全性。
    其实,总感觉密码这种东西记脑子里最安全,但是人不可能记住那么多复杂无规律的密码,所以如果要借助工具记录的话,这种工具越远离互联网越安全吧。“安全”这东西都是有依赖性的,不存在独立的绝对的安全。
    sNullp
        35
    sNullp  
       2014-12-27 03:58:40 +08:00
    endoffight
        36
    endoffight  
       2014-12-27 07:09:05 +08:00 via iPhone
    keepass满足不了你吗?
    gno23x
        37
    gno23x  
    OP
       2014-12-27 08:37:57 +08:00
    @shepherd 黑莓随身带挺麻烦吧,突然想到准备换手机,旧手机里头放个密码管理器貌似不错,还能如你所说远离互联网,哈哈。

    @sNullp 不错,php写的,可以研究一下。

    @endoffight KeePass功能是不错,就是人不在电脑旁边就拿不到密码了。
    kstsca
        38
    kstsca  
       2014-12-27 08:52:26 +08:00
    如何解决 类似 qq 登陆 密码输入,一个一个输?
    GeekGao
        39
    GeekGao  
       2014-12-27 10:21:33 +08:00
    自编算法表,然后把人肉加密记录在email里发给自己多个账户比啥都靠谱
    silver
        40
    silver  
       2014-12-27 13:02:10 +08:00   ❤️ 1
    @gno23x 人不在电脑旁什么意思,总会有个手持设备吧。keepass下分支版覆盖各种系统和手持,同步数据库啊。要有心还不如以keepass为基础做个不错的界面。
    endoffight
        41
    endoffight  
       2014-12-27 13:21:45 +08:00 via Android   ❤️ 1
    keepass 的手机客户端啊,osx啊什么的
    gno23x
        42
    gno23x  
    OP
       2014-12-27 13:36:36 +08:00
    @kstsca 只考虑存储哈。不过感谢 @silver @endoffight 提醒,才知道KeePass有Android客户端,虽然是非官方的。
    llbxwj
        43
    llbxwj  
       2014-12-27 14:06:17 +08:00
    试试花瓣
    llbxwj
        44
    llbxwj  
       2014-12-27 14:09:15 +08:00
    错了,是花密
    KentY
        45
    KentY  
       2014-12-28 23:31:05 +08:00   ❤️ 1
    @gno23x 是的,需要电脑。现在我是通过dropbox同步,多台电脑用着还挺好。 没弄手机的程序,我自己不怎么用的上。
    AlexaZhou
        46
    AlexaZhou  
       2014-12-30 13:05:39 +08:00
    很早之前我也自己实现了一个,和LZ的思路基本一致,不过是本地运行的。因为我觉得密码这些东西通过web来处理不太安全
    传送门:code.google.com/p/text-encrypt

    后来换Mac之后发现系统自带的安全备注很好用,就没继续用这个
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:49 · PVG 03:49 · LAX 12:49 · JFK 15:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.