V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sudoy
V2EX  ›  Python

请问如何保存密钥比较安全?

  •  
  •   sudoy · 2020-05-13 20:27:17 +08:00 · 4013 次点击
    这是一个创建于 1673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我用 Python 的 Tkinter 写了个桌面程序,这个程序调用快递公司的 API,所以有 API 密钥。目前直接把密钥保存在.env 文件里面,然后 os.getevn()获取。请问有什么更安全的办法保存这些密钥?谢谢🙏

    z7356995
        1
    z7356995  
       2020-05-13 21:00:21 +08:00 via Android
    那就把密钥再加密一下,,读取时读过来再解密
    msg7086
        2
    msg7086  
       2020-05-13 21:13:42 +08:00
    没有太好的办法。程序所在的电脑上是可以破解拿到 API 秘钥的。
    systemcall
        3
    systemcall  
       2020-05-13 21:22:42 +08:00
    你的电脑如果可以保证使用那个程序的时候会偷隐私的东西没有打开的话,可以上智能卡。
    便宜点的方法,我见过刷磁卡的,也见过拿扫码枪扫条码的,都可以与电脑本身隔离,前提是电脑在读密钥的时候是安全的。
    sudoy
        4
    sudoy  
    OP
       2020-05-13 21:53:41 +08:00 via iPhone
    直接把密钥写在到代码里面,编译成二进制( exe ),这样应该安全吧。其实主要是担心不小心把软件传给别人,另外原本想设置成环境变量,但是又太明显
    Juszoe
        5
    Juszoe  
       2020-05-13 21:56:28 +08:00
    每次启动的时候输入密钥,只保存在内存中
    doyel
        6
    doyel  
       2020-05-13 21:58:39 +08:00
    自建私有 sync 工具
    baobao1270
        7
    baobao1270  
       2020-05-13 21:59:22 +08:00
    密钥保存在服务器上,桌面端请求服务端,服务端再去调用快递 API 把结果返回客户端。

    #4 如果不加壳的话,string 是明文储存在 PE 文件里的
    Juszoe
        8
    Juszoe  
       2020-05-13 22:04:59 +08:00
    又看了一眼,原来是桌面程序,密钥肯定要存到你的服务器上,而不是让用户自己调用快递公司的 API
    sudoy
        9
    sudoy  
    OP
       2020-05-13 23:03:25 +08:00
    谢谢大家回复!可能我讲的不够清楚,这个是个桌面软件,做成 exe 直接运行的,是给公司内部使用。我想达到的目的就是:1 )密钥只在所安装的电脑上保存,这样为了防止哪天不小心把软件拷贝到别的电脑,连密钥也带过去。这点环境变量可以解决,因为拷贝文件夹的时候环境变量拷贝不走。2 )保存在本地电脑的时候加密一下,别人就算看到这个密钥,也没法拿去别的电脑直接用。我能想到的办法是,把密钥加密然后设置成环境变量。每次启动软件的时候,用户需要输入一个密码,这个密码用来解密环境变量里面的密钥,然后读取到缓存以供软件使用。
    jimmyismagic
        10
    jimmyismagic  
       2020-05-13 23:05:53 +08:00
    加密一下,启动时输入密码解密,放在内存中,可以设置一下超时时间,比如 30 分钟要重新输入密码
    sudoy
        11
    sudoy  
    OP
       2020-05-13 23:11:49 +08:00
    @jimmyismagic 多谢
    crab
        12
    crab  
       2020-05-13 23:14:43 +08:00
    如果是限制电脑加入 cpuid mac 地址 硬盘 id 主板这类作为 key 解密。
    namelosw
        13
    namelosw  
       2020-05-13 23:15:04 +08:00
    最好写个简单的 Web server 配合这个桌面程序,然后 key 在服务端才比较万无一失。

    内存这种东西也是可以 Debug 出来的。比如你想知道桌面微信里面存的什么,用 LLDB 就能拆出来你自己加密的 key,然后用 Alfred 就能解了。

    我没试过 Python 程序,但是想象应该比二进制的只能更简单,或者一样。

    当然毕竟内网如果你觉得用户都比较傻,弄个 Base64 啥的糊弄鬼子也不是不行……
    namelosw
        14
    namelosw  
       2020-05-13 23:17:05 +08:00
    @namelosw 噗,口误,刚设置了个 Alfred workflow,结果 Charles 就说成 Alfred 了。
    weizhen199
        15
    weizhen199  
       2020-05-13 23:27:47 +08:00
    KeePass 配合 onedrive gd 这种?
    mwftts
        16
    mwftts  
       2020-05-13 23:34:04 +08:00 via Android
    @weizhen199 你是没看上下文吧,哈哈
    learningman
        17
    learningman  
       2020-05-13 23:35:25 +08:00 via Android
    @sudoy 最不安全了。。。
    disk
        18
    disk  
       2020-05-13 23:52:17 +08:00 via Android
    密钥拿电脑的 mac 地址或主板 cpu 序列号什么的作为密码加密下再存就行了。纯本地防君子不防小人,不能要求太多。
    Kobayashi
        19
    Kobayashi  
       2020-05-13 23:52:27 +08:00 via Android
    已知方法:1 )如果是分享代码的话。自己保存在本地,.gitignore 忽略 .env ,代码里放个 .env.example. 2 )部署类似,但是使用 AWS secret manager 。这种情况还可能需要 aws key 。
    yousabuk
        20
    yousabuk  
       2020-05-14 00:48:37 +08:00 via iPhone
    最厉害的招式是什么?
    没有招式

    什么样的招式不会被破解?
    没有招式
    elfive
        21
    elfive  
       2020-05-14 07:53:32 +08:00 via iPhone
    @sudoy 以字符串的形式存在 exe 里,容易被扫出来的……你只需要在代码里动态生成这个 key 就能加大难度了,不行就再套个壳,免费壳不行就商业壳,基本就能阻挡大部分有一定经验的人了。除非他懂汇编,懂汇编,能脱壳,对这种人基本无解。
    sudoy
        22
    sudoy  
    OP
       2020-05-14 08:02:09 +08:00
    谢谢小伙伴们~ 还有这么多热心支招的 :thumb
    renmu
        23
    renmu  
       2020-05-14 08:19:52 +08:00 via Android
    在公司局域网搭个验证服务器,可以每次开机查询一遍。
    weizhen199
        24
    weizhen199  
       2020-05-14 09:05:49 +08:00
    @herexf (⊙﹏⊙)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5068 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:39 · PVG 15:39 · LAX 23:39 · JFK 02:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.