我想在使用Cython编译的模块中嵌入配置秘密(例如访问密钥)。这些值不应该从编译的代码中轻易访问,并与实际的源代码隔离。有没有办法从主Python代码的不同来源注入这些值(如cython或c编译器的命令行选项)?
注意:我不想让自己的Cython模块只包含访问键,因为访问键很容易找到。
答案 0 :(得分:2)
那就是说,为了回答编译cython文件后的一般问题,可以使用C预处理器通过-D
命令行标志来注入文本。
用Cython
# file.pyx
cdef extern from "header.h":
cdef char* ARG
def f():
return ARG
C标题
# header.h
// empty, ARG will be inserted by preprocessor
setuptools的
# setup.py
from setuptools import setup, Extension
from Cython.Build import cythonize
import os
ext = [Extension('file', ['file.pyx'],
extra_compile_args=[f'-DARG=\\"{os.environ.get("ARG")}\\"'])]
setup(name='test', ext_modules=cythonize(ext))
行动中
$ set ARG=THING
$ python setup.py build_ext --inplace
$ python
>>> import file
>>> file.f()
b'THING'
答案 1 :(得分:1)
您需要一种注入机制,因为您正确地假设将提取存储在用户可访问的文件中的任何内容。
这绝对意味着无论以何种方式将密钥材料传递给您选择的用户代码,密钥都将被MITM-ed和exfiltrated。是的,用户可访问的代码永远不应该访问密钥。
这当然是一个已解决的问题。使用接受云服务质询的API,以及可选的用户输入(&#34;密码&#34;等),并返回临时授权令牌。令牌应该很快到期,以使会话窃取变得不切实际。只要用户使用访问权限,重新授权过程就应该定期重复。</ p>
这就是例如SSH有效。您可以使用操作系统权限或硬件令牌安全地隐藏SSH密钥(请参阅U2F)。您也可以尝试将U2F与GPG一起使用;一些云服务本身可能支持U2F。
到目前为止,您肯定记得安全无法固定到现有解决方案的想法,但必须从一开始就将其构建到其中。您可能需要在考虑安全性的情况下重新考虑更广泛的应用程序,并提出适当的授权机制。我不知道你问题的具体细节,所以我不能猜出具体的方法。