有没有办法从命令行将常量注入Cython模块?

时间:2018-01-23 11:31:01

标签: python cython

我想在使用Cython编译的模块中嵌入配置秘密(例如访问密钥)。这些值不应该从编译的代码中轻易访问,并与实际的源代码隔离。有没有办法从主Python代码的不同来源注入这些值(如cython或c编译器的命令行选项)?

注意:我不想让自己的Cython模块只包含访问键,因为访问键很容易找到。

2 个答案:

答案 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。

到目前为止,您肯定记得安全无法固定到现有解决方案的想法,但必须从一开始就将其构建到其中。您可能需要在考虑安全性的情况下重新考虑更广泛的应用程序,并提出适当的授权机制。我不知道你问题的具体细节,所以我不能猜出具体的方法。