大家好,我用 Python 的 Tkinter 写了个桌面程序,这个程序调用快递公司的 API,所以有 API 密钥。目前直接把密钥保存在.env 文件里面,然后 os.getevn()获取。请问有什么更安全的办法保存这些密钥?谢谢🙏
|      1z7356995      2020-05-13 21:00:21 +08:00 via Android 那就把密钥再加密一下,,读取时读过来再解密 | 
|  |      2msg7086      2020-05-13 21:13:42 +08:00 没有太好的办法。程序所在的电脑上是可以破解拿到 API 秘钥的。 | 
|      3systemcall      2020-05-13 21:22:42 +08:00 你的电脑如果可以保证使用那个程序的时候会偷隐私的东西没有打开的话,可以上智能卡。 便宜点的方法,我见过刷磁卡的,也见过拿扫码枪扫条码的,都可以与电脑本身隔离,前提是电脑在读密钥的时候是安全的。 | 
|  |      4sudoy OP 直接把密钥写在到代码里面,编译成二进制( exe ),这样应该安全吧。其实主要是担心不小心把软件传给别人,另外原本想设置成环境变量,但是又太明显 | 
|  |      5Juszoe      2020-05-13 21:56:28 +08:00 每次启动的时候输入密钥,只保存在内存中 | 
|  |      6doyel      2020-05-13 21:58:39 +08:00 自建私有 sync 工具 | 
|  |      7baobao1270      2020-05-13 21:59:22 +08:00 密钥保存在服务器上,桌面端请求服务端,服务端再去调用快递 API 把结果返回客户端。 #4 如果不加壳的话,string 是明文储存在 PE 文件里的 | 
|  |      8Juszoe      2020-05-13 22:04:59 +08:00 又看了一眼,原来是桌面程序,密钥肯定要存到你的服务器上,而不是让用户自己调用快递公司的 API | 
|  |      9sudoy OP 谢谢大家回复!可能我讲的不够清楚,这个是个桌面软件,做成 exe 直接运行的,是给公司内部使用。我想达到的目的就是:1 )密钥只在所安装的电脑上保存,这样为了防止哪天不小心把软件拷贝到别的电脑,连密钥也带过去。这点环境变量可以解决,因为拷贝文件夹的时候环境变量拷贝不走。2 )保存在本地电脑的时候加密一下,别人就算看到这个密钥,也没法拿去别的电脑直接用。我能想到的办法是,把密钥加密然后设置成环境变量。每次启动软件的时候,用户需要输入一个密码,这个密码用来解密环境变量里面的密钥,然后读取到缓存以供软件使用。 | 
|      10jimmyismagic      2020-05-13 23:05:53 +08:00 加密一下,启动时输入密码解密,放在内存中,可以设置一下超时时间,比如 30 分钟要重新输入密码 | 
|  |      11sudoy OP @jimmyismagic  多谢 | 
|  |      12crab      2020-05-13 23:14:43 +08:00 如果是限制电脑加入 cpuid mac 地址 硬盘 id 主板这类作为 key 解密。 | 
|      13namelosw      2020-05-13 23:15:04 +08:00 最好写个简单的 Web server 配合这个桌面程序,然后 key 在服务端才比较万无一失。 内存这种东西也是可以 Debug 出来的。比如你想知道桌面微信里面存的什么,用 LLDB 就能拆出来你自己加密的 key,然后用 Alfred 就能解了。 我没试过 Python 程序,但是想象应该比二进制的只能更简单,或者一样。 当然毕竟内网如果你觉得用户都比较傻,弄个 Base64 啥的糊弄鬼子也不是不行…… | 
|      14namelosw      2020-05-13 23:17:05 +08:00 @namelosw 噗,口误,刚设置了个 Alfred workflow,结果 Charles 就说成 Alfred 了。 | 
|  |      15weizhen199      2020-05-13 23:27:47 +08:00 KeePass 配合 onedrive gd 这种? | 
|  |      16mwftts      2020-05-13 23:34:04 +08:00 via Android @weizhen199 你是没看上下文吧,哈哈 | 
|  |      17learningman      2020-05-13 23:35:25 +08:00 via Android @sudoy 最不安全了。。。 | 
|  |      18disk      2020-05-13 23:52:17 +08:00 via Android 密钥拿电脑的 mac 地址或主板 cpu 序列号什么的作为密码加密下再存就行了。纯本地防君子不防小人,不能要求太多。 | 
|      19Kobayashi      2020-05-13 23:52:27 +08:00 via Android 已知方法:1 )如果是分享代码的话。自己保存在本地,.gitignore 忽略 .env ,代码里放个 .env.example. 2 )部署类似,但是使用 AWS secret manager 。这种情况还可能需要 aws key 。 | 
|  |      20yousabuk      2020-05-14 00:48:37 +08:00 via iPhone 最厉害的招式是什么? 没有招式 什么样的招式不会被破解? 没有招式 | 
|  |      21elfive      2020-05-14 07:53:32 +08:00 via iPhone @sudoy 以字符串的形式存在 exe 里,容易被扫出来的……你只需要在代码里动态生成这个 key 就能加大难度了,不行就再套个壳,免费壳不行就商业壳,基本就能阻挡大部分有一定经验的人了。除非他懂汇编,懂汇编,能脱壳,对这种人基本无解。 | 
|  |      22sudoy OP 谢谢小伙伴们~ 还有这么多热心支招的 :thumb | 
|      23renmu      2020-05-14 08:19:52 +08:00 via Android 在公司局域网搭个验证服务器,可以每次开机查询一遍。 | 
|  |      24weizhen199      2020-05-14 09:05:49 +08:00 @herexf (⊙﹏⊙) |