近年来,随着大数据与人工智能的盛行,针对个人的个性化的推荐技术的不断发展,人们在享受便利的同时,也深深的感觉到无处不在的监控与监事,比如刚刚浏览了一个网站的商品,当去其他网站访问的时候就会推荐类似的产品;刚刚搜索了某件商品,在很多其他的场景中都会给你推荐。这种体验,谈不上不好,也谈不上多坏,但是如果仔细想想,就感觉自己的网上进行裸奔,个人隐私,一清二楚,毫无隐私可言,细思极恐。
不过随着广大用户对于个人隐私的重视程度不断加强,以及法律法规的不断完善,针对个人隐私的保护提出了更高的要求,什么样的数据可以采集、收集与使用,如何使用都是一个比较敏感的问题。十三届全国人大常委会第三十次会议表决通过了《中华人民共和国个人信息保护法》,并与2021年11月1日起施行。确立个人信息保护原则、规范处理活动保障权益、禁止“大数据杀熟”规范自动化决策、严格保护敏感个人信息、赋予个人充分权利等。新规施行后,违法的主体将最高可处五千万以下或者上一年度营业额百分之五以下的罚款。
鉴于上述情况,近年来隐私计算技术被不断的提及,源于其有优秀的数据保护作用,使得**“数据不出域、数据可用不可见、数据可算不可见”**,限定了数据的使用场景,防止了数据的泄露,而引起了业界的热捧。
隐私计算技术的演进历程如下图描述,以下是杨强教授在KDD 2021中国区的分享材料:
可以看到,隐私计算技术从1979年就开始了,最开始是安全多方计算、到差分隐私、到TEE,再到最近火的不能再火的联邦学习,一系列的技术应运而生。那为啥现在隐私计算这么火呢。
但是这些技术本身的安全加密都是采用共同的方法与策略,下面讲述下隐私计算的加密技术。
针对隐私计算的加密技术来说,不管这些技术如何演进,从根本来说,加密的方式主要有以下几种:
本文主要介绍同态加密,
我们经常听到这样的话,“我们要对数据进行加密,保障数据的安全”。但是这句话实在是太笼统,太抽象,可以量化的信息量太少,没有太多的信息增益。比如我们要在什么时候加密、在什么场景加密、在什么节点加密、在什么流程中加密?这些都没有表述清楚,所以这种话就是官话,听起来始终没有错,但是就是没啥用。
众所周知,优秀的程序员需要严谨的逻辑思维与具象能力,当然在材料的时候,可能需要适当的渲染。但是对于技术的理解,对技术的探索,严谨的逻辑与坚实的推理是非常重要的。所以,对于“数据加密”这个命题,需要进行一番探索。
这里,我尝试用数据声明周期的全链路来进行思考,进而可以得出如下的结论:
如此三态合一,即可保障数据的全链路的生命周期安全。
数据存储与传输加密,这两门技术已经在互联网中大量使用,比如我们使用某个加密算法,例如对称加密,将数据加密后存储在磁盘上。又比如,我们使用基于TLS协议的HTTP(HTTPS)进行数据的可靠与安全传输。但是对于数据计算来说,我们通常的做法是在内存运行态,将数据解密成明文,进而进行计算,也就是说在计算过程中都是明文的,所以对于内存攻击来说,这个数据是可以得到的,进而有泄漏的风险。
那么有没有办法解决数据计算的安全问题呢?答案就是同态加密技术。保障数据的运行态的安全,那么同态加密技术具体是如何实现,如何应用,并且有哪些限制呢?
同态加密(Homomorphic Encryption)在密码学的历史比较悠久。早在1978年,Ron Rivest, Leonard Adleman, 以及Michael L. Dertouzos就以金融行业为应用背景,进而提出了这个概念[RAD78]。对,你没有看错,Ron Rivest和Leonard Adleman分别就是著名的RSA算法中的R和A,该方案基于公钥密码体系RSA,此方案满足乘法同态性。
首位构造出全同态加密方案的人是Gentry,是其在Stanford攻读博士学位的研究成果。Gentry毕业后IBM。在那里Gentry和另一个密码学大牛Halevi继续进行同态加密及其相关的研究,并实现了一些同态加密方案。
Paillier加密系统,是1999年paillier发明的概率公钥加密系统。基于复合剩余类的困难问题。该加密算法是一种同态加密,满足加法和数乘同态。
2009年Dijk、Gentry等人提出了整数上的完全同态加密方案,困难性基于近似GCD难题。该方案主要贡献是将原来基于“理想格”的SWHE替换为一个非常简单的整数描述的SWHE。在概念上的进行了极大的化简,但依旧是使用Gentry的同态解密技术将SWHE其转化为FHE。故效率没有提高。
2011年Brakerski、Gentry、Vaikuntanathan提出的完全同态加密方案[3],简称BGV方案,可以看做第二代FHE。困难性基于LWE(纠错学习)。利用密钥交换技术、模交换技术来降低密文维数和减弱噪音,使得效率大大提高。
什么是同态加密?,引用Gentry大佬的原话:
A way to delegate processing of your data, without giving away access to it.
同态加密(Homomorphic Encryption, HE),指满足密文同态运算性质的加密算法,即数据经过同态加密之后,对密文进行某些特定的计算,得到的密文计算结果在进行对应的同态解密后的明文等同于对明文数据直接进行相同的计算,实现数据的“可算不可见”。同态加密的实现效果如图所示。
举个例子:国内某家大型的三甲医院,由于历史悠久,并且医术精湛,历史遗留了大量的用户病例数据。如今思考基于这些病例数据进行建模分析。但是由于数据量特别巨大,医院本身的IT资源有限,计算能力不足。
这个时候,云厂商找了过来。但是对于医院来说,这些数据本身是用户的隐私信息,并且也是医院的核心价值,所以尽管云厂商再三保证数据安全,但是医院还是不能够放心的将数据上传到云厂商进行计算。
正当这个事情推进不下去的时候,云厂商从密码行业花大价钱招来某个大牛,大牛提出一个方案,这样吧,我们现在有这样一门技术,不需要传输明文数据,只需要传输密文就好,而且加密秘钥由医院自己保存,我们基于上传的密文数据做不解密的密态运算( 并计算函数医院提供就好),这样数据不会泄露,云厂商对数据无感知,之后传回密文结果,医院自己解密就好。医院一听非常高兴,那就这么办吧。
下面将核心流程描述下。
Key
和 Encrypt
算法加密本地的数据,记为 EncData = Encrypt(Key, Data)
F()
Evaluate(F(), EnData) = Encrypt(Key, F(Data))
,记为 CompEncData
,并传回医院F(Data) = Decrypt(Key, CompEncData)
,也就是最终结果这里,大家可能有个问题,这个f应该是什么样的函数,有什么样的限制条件?HE方案是支持任意的数据处理方法f,还是说只支持满足一定条件的f呢?根据f的限制条件不同,HE方案实际上分为了两类:
**FHE - Fully Homomorphic Encryption **:在这种模式下,HE方案支持任意给定的f函数,只要这个f函数可以通过算法与策略描述,并且可以用计算机实现。显然,从目标场景角度来说,FHE方案是一个非常棒的方案,但是从实际落地角度老说,由于其计算开销极大,暂时还无法在实际中使用,这个领域存在广阔的探索空间。
**SWHE - Somewhat Homomorphic Encryption **:在这种模式下,HE方案只支持一些特定的f函数。从目标场景角度来说,SWHE方案稍弱,支持能力有限。但正因为这种有限,同时也意味着开销变得较小,实现容易,所以现在已经可以在实际中使用,比如在联邦学习的安全树模型中,就使用了这门技术,使用同态加法进行梯度直方图的构建。
在工业界大名鼎鼎的同态加密库就是Paillier了,在很多场景中都能看到其忙碌的身影,笔者在工作中也使用过这个库,相对来说从性能与便捷的角度来说还是比较优秀的,不过其支持同态加法,如果想要使用同态乘法需要使用RSA算法。
Paillier加密算法是Pascal paillier[1]在1999年发明的概率公钥加密算法,该算法基于复合剩余类的困难问题,是一种满足加法的同态加密算法,已经广泛应用在加密信号处理或第三方数据处理领域。
前面我们分析过同态加密的核心流程,大家可以一起回忆一下。核心的函数包括:秘钥生成、明文加密、密文解密,下面我们来一步一步的分析,并且描述下,
秘钥的生成主要有如下的步骤,
下面介绍一个完整的同态运算,m由 m 1 与 n m 2 m_1与nm_2 m1与nm2组成,介绍下同态加密的是如何使用密文计算的。
""
Benchmark key generation, encryption and decryption.
"""
import random
import resource
import time
import phe.paillier as paillier
def bench_encrypt(pubkey, nums):
for num in nums:
pubkey.encrypt(num)
def bench_decrypt(prikey, nums):
for num in nums:
prikey.decrypt(num)
def bench_add(nums1, nums2):
for num1, num2 in zip(nums1, nums2):
num1 + num2
def bench_mul(nums1, nums2):
for num1, num2 in zip(nums1, nums2):
num1 * num2
def time_method(method, *args):
start = time.time()
method(*args)
return time.time() - start
def bench_time(test_size, key_size=128):
print('Paillier Benchmarks with key size of {} bits'.format(key_size))
pubkey, prikey = paillier.generate_paillier_keypair(n_length=key_size)
nums1 = [random.random() for _ in range(test_size)]
nums2 = [random.random() for _ in range(test_size)]
nums1_enc = [pubkey.encrypt(n) for n in nums1]
nums2_enc = [pubkey.encrypt(n) for n in nums2]
ones = [1.0 for _ in range(test_size)]
times = [
time_method(bench_encrypt, pubkey, nums1),
time_method(bench_decrypt, prikey, nums1_enc),
time_method(bench_add, nums1_enc, nums2),
time_method(bench_add, nums1_enc, nums2_enc),
time_method(bench_add, nums1_enc, ones),
time_method(bench_mul, nums1_enc, nums2)
]
times = [t / test_size for t in times]
ops = [int(1.0 / t) for t in times]
print(
'operation: time in seconds (# operations per second)\n'
'encrypt: {:.6f} s ({} ops/s)\n'
'decrypt: {:.6f} s ({} ops/s)\n'
'add unencrypted and encrypted: {:.6f} s ({} ops/s)\n'
'add encrypted and encrypted: {:.6f} s ({} ops/s)\n'
'add encrypted and 1: {:.6f} s ({} ops/s)\n'
'multiply encrypted and unencrypted: {:.6f} s ({} ops/s)'.format(
times[0], ops[0], times[1], ops[1], times[2], ops[2],
times[3], ops[3], times[4], ops[4], times[5], ops[5]
)
)
return times
def bench_mem(test_size):
r_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
pubkey, prikey = paillier.generate_paillier_keypair()
nums = []
for i in range(test_size):
if not i % 10000:
# This is probably KB (i.e. 1000 bytes) when run on linux
r = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss - r_init
print('Memory usage for {:,} encrypted numbers = {:,} ({:.4f} per '
'number)'.format(i, r, i and r / i))
nums.append(pubkey.encrypt(random.random()))
# bench_mem(1000000) # NOTE: this will take a long time
times = []
key_sizes = [128, 256, 512, 1024, 2048, 4096, 8192]
for key_size in key_sizes:
times.append(bench_time(1000, key_size))
个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:[email protected]