SDU Crypto School - 计算不可区分性1

Encryption: Computational security 1-4

主讲人:李增鹏(山东大学)

参考教材:Jonathan Katz, Yehuda Lindell, Introduction to Modern Cryptography - Principles and Protocols.


什么是加密

首先,加密方案的目的在于在Alice和Bob之间完成安全的通信。具体地,任意给定明文 m m m,Alice对它进行加密得到 c c c并且通过不安全信道发送给Bob,Bob对 c c c进行解密后得到 m m m,而第三者Eve不能获得 m m m的任何相关信息。

在这里插入图片描述


为了做到这个事情,从古至今有很多所谓的密码方案,比如凯撒密码、弗吉尼亚密码、栅栏加密、Enigma机等等。

这些方案的共同特点之一是,没有严谨的理论来确保它们是安全的。与其说是密码科学,不如说是承载了古人灿烂想象力的密码艺术。

这些方案的共同特点之二是,它们都被破掉了。据(Prof. 丁津泰)说,阿根廷人在马岛海战中还在用类似Enigma机的密码系统,于是战场信息理所应当地对英国人单向透明。


可证明安全是密码学从艺术向科学迈出的重要一步。

设计现代密码系统的另一个原则是,密码系统的安全性不依赖于加密方案或者算法的保密,而是依赖于密钥的安全性(Kerckhoffs原则, 1883)。

理由如下:

  1. 保护密钥其实比保护算法更容易;
  2. 更换密钥也比更换算法更容易;
  3. 加密算法进行统一,方便了应用;
  4. 公开算法,有助于算法漏洞的分析。

于是我们可以根据Kerckhoffs原则把加密系统的general picture进行改写:

  • m m m是明文消息
  • 密钥 k k k从均匀分布中抽取
  • c = E n c k ( m ) c = Enc_k(m) c=Enck(m)暴露给攻击者

注意到,和加密系统的最一般情况相比,这里我们引入了密钥 k k k,希望攻击者没法获取到 k k k m m m的相关信息。


完美的安全性

一些记号:

在这里插入图片描述

现在的问题是,在Kerckhoffs原则的框架下,我们怎么去定义一个密码系统的安全性?


想法一:

定义. 如果攻击者没办法计算 k k k,那么这个scheme就是安全的。

——密钥不让人知道是确实有道理…吧。

一个反例就是, E n c k ( m ) = m Enc_k(m) = m Enck(m)=m。这种情况下,你确实没暴露任何的 k k k的信息,但是 m m m在裸奔,加密的安全性效果类似于皇帝的新衣。

在这里插入图片描述


想法二:

定义. 如果攻击者没办法计算 m m m,那么这个scheme就是安全的。

如果一个攻击者只需要计算密文 m m m的某些特征就能推断出足够的信息,那这个scheme还安全吗?

比如我猜一个四字地名是齐齐哈尔还是乌鲁木齐。我甚至只需要这四个字里带几个齐字或者有没有重复字就能推测出答案。


想法三:

定义. 如果攻击者不能获得 m m m的任何相关信息,那么这个scheme就是安全的。

但是攻击者可能已经获得了一些先验信息,比如知道消息 m m m是用英语写的。


想法四:

定义. 如果攻击者不能获得 m m m的任何额外信息,那么这个scheme就是安全的。

这个是比较靠谱的,但是怎么正式表述它?

一个例子是使用概率分布/信息论进行描述:

上半拉图是通信前。 m m m在Alice手里,攻击者什么都不知道,它有关于 m m m的一个先验分布。

下半拉图是通信后。 m m m在Alice手里,攻击者知道 c = E n c k ( m ) c = Enc_k(m) c=Enck(m),在知道 c c c的前提下,攻击者的先验没有产生丝毫的变化。这就是所谓的“攻击者不能获得关于 m m m的任何额外信息”。

于是,我们得到基于条件概率表述的完美安全性定义:

等价地,我们有几个定义:

  • 明文 m m m的分布和 E n c k ( m ) Enc_k(m) Enck(m)是独立的。
  • E n c k ( m ) Enc_k(m) Enck(m)的分布和 m m m无关。
  • 对任意的 m 0 m_0 m0 m 1 m_1 m1,我们有 E n c k ( m 0 ) Enc_k(m_0) Enck(m0) E n c k ( m 1 ) Enc_k(m_1) Enck(m1)有相同的分布。

完美安全性的一个等价定义是对手的不可识别性(Adversarial Indistinguishability)。这里,我们引入一个对手 A \mathcal{A} A,并且定义什么是 A \mathcal{A} A不可识别性(粗略地说,给定明文 m 0 , m 1 m_0, m_1 m0,m1并且随机挑选一个进行加密得到 c c c A \mathcal{A} A没法知道这个 c c c对应的明文是 m 0 , m 1 m_0, m_1 m0,m1的哪个)。

为了定义完美安全性,我们引入一个不可区分性实验(experiment)或者说是游戏(game),记为 P r i v K A , Π e a v PrivK^{eav}_{\mathcal A, \Pi} PrivKA,Πeav。这里, Π = ( G e n , E n c , D e c ) \Pi=(Gen, Enc, Dec) Π=(Gen,Enc,Dec)是密码系统,这个游戏只考虑窃听(eavesdropping)攻击者 A \mathcal A A,攻击者拥有的后验信息只有一个 c c c并且试图基于这个 c c c确定明文的一些信息。

定义. P r i v K A , Π e a v PrivK^{eav}_{\mathcal A, \Pi} PrivKA,Πeav定义如下:

  1. 初始化加密方案(比如,生成密钥 k k k)。
  2. 攻击者给出一对明文 m 0 , m 1 ∈ M m_0, m_1 \in \mathcal M m0,m1M
  3. 通信方在攻击者不知情的情况下随机挑选一个 m b , b ∈ { 0 , 1 } m_b, b\in \{0, 1\} mb,b{0,1},加密后返回 c c c
  4. 攻击者根据 c c c给出一个 b b b的估计 b ′ b' b。注意,这个 b ′ b' b可能是一个概率分布。
  5. 如果 b = b ′ b = b' b=b,那么攻击者赢(return 1),反之输(return 0)。

如果系统是安全的,那么你攻击者对 c c c再怎么折腾,最后输出的结果和瞎猜的效果是一样的。

于是我们可以定义不可区分性:

定义. 定义在明文空间 M \mathcal M M上的密码系统 ( G e n , E n c , D e c ) (Gen, Enc, Dec) (Gen,Enc,Dec)是不可区分的,如果:

P [ P r i v K A , Π e a v = 1 ] = 1 2 P[PrivK^{eav}_{\mathcal A, \Pi} = 1] = \frac{1}{2} P[PrivKA,Πeav=1]=21


一次性密码本

现实中就存在一个具有完美安全性的加密方案:一次性密码本(One Time Pad, OTP)。

对于一个二进制串 m m m,我们随机生成和 m m m等长的二进制串 k k k,其中 k k k的每一位都是独立的均匀分布, c = E n c k ( m ) = m ⊕ k c = Enc_k(m) = m \oplus k c=Enck(m)=mk,其中 ⊕ \oplus 被定义为异或运算。

OTP的安全性是显然的。因为,对每个 m m m而言, c c c的每一位都是均匀分布的。

我们将OTP进行一般化:

( G , + ) (G, +) (G,+)为加群。 K = M = C = G \mathcal K = \mathcal M=\mathcal C=G K=M=C=G。于是,

  • E n c k ( m ) = m + k Enc_k(m) = m+k Enck(m)=m+k
  • D e c k ( m ) = m − k Dec_k(m)=m-k Deck(m)=mk
    构成了一次性密码本。

但是OTP不实用,因为:

  • 密钥和明文等长

  • 一次一密,用后即焚,否则可能会泄露信息。

    比如在OTP中,如果相同的密钥加密 m 1 , m 2 m_1, m_2 m1,m2后得到 c 1 , c 2 c_1, c_2 c1,c2,那么攻击者就知道 m 1 ⊕ m 2 = c 1 ⊕ c 2 m_1 \oplus m_2 = c_1 \oplus c_2 m1m2=c1c2——这泄露了明文的信息。

此外,我们可以证明,一个密码系统如果是具有完美安全性的,那么必然是 ∣ K ∣ ≥ ∣ M ∣ |\mathcal K| \geq |\mathcal M| KM

(原因很简单,假如 ∣ K ∣ < ∣ M ∣ |\mathcal K| < |\mathcal M| K<M,原本攻击者是要去猜 m m m的,现在攻击者猜 k k k的胜算还比猜 m m m的胜算还大,这意味着加密过程泄露了信息。)

于是,OTP就成了完美安全性中最高效的方案。


“可以收手了吗,阿祖?”


限制攻击者的能力:不可区分性、语义安全性

要想做出实用性更强的密码系统,一个想法是对攻击者的能力进行限制。

限制方法包括:

  1. 限制攻击者的计算能力——计算安全性。
  2. 其他方法:量子密码学、内存限制模型etc

量子密码学的特征是:攻击者(Eve)不可能在通信方(Alice和Bob)不知情的情况下实现窃听。一旦攻击者成功实施窃听,那么量子的状态就会被干扰,通信方可以通过基于量子状态传输的通信内容知道自己被窃听了。

在这里插入图片描述
在这里插入图片描述

(需要注意一点,量子密码和量子计算不是一个东西)


主流方法是对攻击者进行计算能力的限制。如果攻击者可以不计成本地做穷举攻击,那么什么样的密码都会被破解。

问题来了:如何定义对攻击者计算能力的限制?

攻击者可以买若干块V100并且用到报废、或者一年内租若干台云服务器吗?

即使有这些个计算资源,那攻击者运行什么样的攻击算法呢?

所以说这种定义在理论上不是太美观的,也不方便分析。

下面我们对计算模型进行抽象。具体地,我们可以用图灵机描述攻击者的能力:

一个系统 X X X ( t , ϵ ) (t, \epsilon) (t,ϵ)安全的,如果任意一个运行时长不超过 t t t的图灵机破解它的概率不超过 ϵ \epsilon ϵ

其实存在很多图灵机模型,基本上都可以证明它们和最一般的图灵机是等价的。然后Church-Turing命题也告诉我们,任何在算法上可计算的问题同样可由图灵机计算。于是我们可以把各种各样基于图灵机的模型抽象一下变成一个个算法,于是所有的讨论都基于算法进行,这就避免了去脑补图灵机的纸带和读写头怎么飞舞。


对于前述的 ( t , ϵ ) (t, \epsilon) (t,ϵ)安全性,我们使用渐进分析的方法进行具体化。

  • 图灵机运行 t t t步,意味着“高效的计算”
  • ϵ \epsilon ϵ,是一个非常小(接近0)的数

定义这些东西的方式是使用渐进分析的思路。

直接说结论,我们认为的小是小于任何的多项式倒数,即小于任何的 1 / p o l y ( n ) 1/poly(n) 1/poly(n)

我们认为的高效计算是有多项式复杂度的计算。

这种用多项式定义的小具有比较好的性质:


基于上面的东西,我们对计算安全性进行进一步的定义。首先,我们对密钥加密方案(private-key encryption scheme)进行定义:

定义. 私钥密码学方案是三个概率多项式时间(Probability polynomial time, PPT)算法 ( G e n , E n c , D e c ) (Gen, Enc, Dec) (Gen,Enc,Dec),其中:

  1. G e n Gen Gen:输入安全参数 n n n返回一个密钥 k k k。一般认为 ∣ k ∣ ≥ n |k| \geq n kn
  2. E n c Enc Enc:输入密钥 k k k和明文消息 m ∈ { 0 , 1 } ∗ = ⋃ N = 1 ∞ { 0 , 1 } N m \in \{0, 1\}^* = \bigcup_{N=1}^\infty \{0, 1\}^N m{0,1}=N=1{0,1}N。输出的密文有可能是随机的。
  3. D e c Dec Dec:输入密钥 k k k和密文消息 c c c,输出 m m m或者抛出错误。

要求:对于任意的 n , k , m n, k, m n,k,m D e c k ( E n c k ( m ) ) = m Dec_k(Enc_k(m)) = m Deck(Enck(m))=m

我们仍然没有很好地假设攻击者的能力。比如攻击者可能用什么样的算法进行攻击。我们接下来设计的安全性定义将防御住攻击者在给定计算能力的情况下的任何攻击。

在完美安全性中,攻击者不能从密文中获取任何明文的相关信息。在限制了攻击者的计算能力后,我们将定义语义安全性。语义安全性不是那么实用,我们又搞出了一个叫不可区分性的东西。不可区分性和语义安全性等价,但是不可区分性好用。

我们在攻击者能力受限的情况下,也搞一个不可识别性之类的东西。和完美安全性那里引入的game的区别在于,我们改动两个地方:

  1. 攻击者的能力被限制为多项式时间
  2. 攻击者攻击的成功率是小的,这个小被定义为 1 2 + ϵ ( n ) \frac{1}{2}+ \epsilon(n) 21+ϵ(n)

于是我们得到game:

定义. adversarial indistinguishability窃听攻击下的不可区分性实验 P r i v K A , Π e a v ( n ) PrivK^{eav}_{\mathcal A, \Pi}(n) PrivKA,Πeav(n)

  1. 攻击者 A \mathcal A A给定安全参数,输出两个密文 m 0 , m 1 m_0, m_1 m0,m1,其中 ∣ m 0 ∣ = ∣ m 1 ∣ |m_0| = |m_1| m0=m1
  2. 防御方生成密钥 k k k和一个随机比特 b b b。计算 c = E n c k ( m b ) c = Enc_k(m_b) c=Enck(mb)
  3. 攻击者获得 c c c后通过一通计算输出比特 b ′ b' b
  4. 如果 b ′ = b b' = b b=b,则攻击者赢,记为 P r i v K A , Π e a v ( n ) = 1 PrivK^{eav}_{\mathcal A, \Pi}(n) = 1 PrivKA,Πeav(n)=1

基于此我们有计算不可区分性的定义:

定义. 加密方案 Π = ( G e n , E n c , D e c ) \Pi = (Gen, Enc, Dec) Π=(Gen,Enc,Dec)在窃听攻击下是计算不可区分的(EAV-SECURE),如果对所有的PPT算法攻击 A \mathcal A A,都存在足够小的函数,使得对于任意的 n n n
P [ P r i v K A , Π e a v ( n ) = 1 ] ≤ 1 2 + ϵ ( n ) P[PrivK^{eav}_{\mathcal A, \Pi}(n) = 1] \leq \frac{1}{2} + \epsilon(n) P[PrivKA,Πeav(n)=1]21+ϵ(n)

其中 ϵ ( n ) \epsilon(n) ϵ(n)是我们前面定义的小量。

一个等价的定义是,假设我们给实验 P r i v K A , Π e a v ( n ) PrivK^{eav}_{\mathcal A, \Pi}(n) PrivKA,Πeav(n)开了影分身,这两个影分身实验在选择比特 b b b的时候一个选了0一个选了1,那么攻击者其实是分辨不出他自己在和哪个影分身搏斗的。

这个定义的书写留作练习,或者参考书。

注意,这里涉及的加密方案并不需要隐藏明文的长度信息。我们暂时假设明文长度都是相等的,具体为什么要这么假设不妨参考书中的相关内容,因为这个问题暂时不影响主线叙述。


为了介绍语义安全性,我们首先更进一步地品味计算不可区分性的意义。

  • 计算不可区分,意味着攻击者不可能通过他的那些计算花招在猜测明文的某一个比特方面有显著的优势。

  • 计算不可区分,意味着攻击者不可能通过他的那些计算花招学到明文的任意一个函数 f ( m ) f(m) f(m),其中 m m m定义在任意一个集合 S ⊂ { 0 , 1 } l \mathcal S \subset \{0, 1\}^l S{0,1}l中,并且 f ( m ) f(m) f(m)输出 的值是0-1比特。也即,攻击者利用密文 c c c算对函数 f ( m ) f(m) f(m)的概率应该和攻击者什么都不知道没有太多的差别。(否则就是泄露了信息)。

基于上述叙述,我们给出语义安全性的定义:

定义. 一个加密方案 ( E n c , D e c ) (Enc, Dec) (Enc,Dec)在窃听攻击下是语义安全的,如果对于任意的PPT算法 A \mathcal A A,都有一个PPT算法 A ′ \mathcal A' A,使得下列东西是小量:

∣ P [ A ( 1 n , E n c k ( m ) , h ( m ) ) = f ( m ) ] − P [ A ′ ( 1 n , ∣ m ∣ , h ( m ) ) = f ( m ) ] ∣ |P[\mathcal A(1^n, Enc_k(m), h(m))=f(m)] - P[\mathcal A'(1^n, |m|, h(m))=f(m)]| P[A(1n,Enck(m),h(m))=f(m)]P[A(1n,m,h(m))=f(m)]

其中 h ( m ) h(m) h(m)是攻击者已经掌握的外部消息。在语义安全性中,攻击者用算法 A \mathcal A A在给定 c = E n c k ( m ) c=Enc_k(m) c=Enck(m) h ( m ) h(m) h(m)的情况下计算 m m m的函数 f ( m ) f(m) f(m),它的效果应该和攻击者用任意一个算法 A ′ \mathcal A' A在给定 h ( m ) h(m) h(m) ∣ m ∣ |m| m的情况下计算 f ( m ) f(m) f(m)差不多。

定理. 计算不可区分性和语义安全性等价。


伪随机性和流密码

伪随机数生成器 G G G是一个高效的(多项式时间)、确定性的算法,可以将一个短的、采样自均匀分布的比特串(种子, seed)转化成一个长的、看起来采样自均匀分布的比特串。

研究伪随机数的意义在于从统计意义上模拟随机性。为了判断出各种伪随机数究竟不随机在哪儿,可以构造出各种各样的统计量。

一个问题在于,如何判断伪随机数的随机性?类似于计算安全性,我们可以想出来一个类似于计算随机性的东西:一个好的伪随机数生成器需要骗过所有(可以高效地计算)的统计量。

于是,我们给出正式定义:

定义. l l l是一个多项式, G G G是一个确定性的多项式时间算法,使得对于任意的 n n n(安全参数,在这里是种子的长度)和任意的输入 s ∈ { 0 , 1 } n s \in \{0, 1\}^n s{0,1}n(这是随机种子), G ( s ) G(s) G(s)是长度为 l ( n ) l(n) l(n)的串。我们说 G G G是伪随机数生成器,如果:

  1. 对于任意的 n n n,有 l ( n ) > n l(n) > n l(n)>n
  2. 对于任意的概率多项式时间算法 D D D,存在一个小量 ϵ ( n ) \epsilon(n) ϵ(n)使得
    ∣ P [ D ( G ( s ) ) = 1 ] − P [ D ( r ) = 1 ] ∣ ≤ ϵ ( n ) |P[D(G(s))=1] - P[D(r) = 1]| \leq \epsilon(n) P[D(G(s))=1]P[D(r)=1]ϵ(n)

其中,我们称 l l l是伪随机数生成器的扩张因子。我们认为 D D D是随机性判别器, D ( ⋅ ) = 1 D(·)=1 D()=1表明,它认为输入的东西是随机的,反之它认为输入的东西不是随机的。 s ∈ { 0 , 1 } n s \in \{0, 1\}^n s{0,1}n r ∈ { 0 , 1 } l ( n ) r\in \{0, 1\}^{l(n)} r{0,1}l(n)均采样自均匀分布。

实际上,伪随机数生成的东西显然不是均匀的。比如设我们有 n n n比特的种子, l ( n ) = 2 n l(n) = 2n l(n)=2n。确定性映射 G G G最多将 2 n 2^n 2n个种子映射到像空间( 2 n 2^n 2n个值),而 { 0 , 1 } 2 n \{0, 1\}^{2n} {0,1}2n空间中还有 2 2 n − 2 n 2^{2n}-2^n 22n2n个值没有映射到。

另一个问题是,伪随机数生成器是不是真的存在?实际上我们不知道怎么无条件地证明伪随机数的存在,但是我们有很站得住脚的原因可以相信它存在。首先,如果假设单向函数(单向函数 f f f具有性质:给定 x x x计算 f ( x ) f(x) f(x)是容易的,但是给定 f ( x ) f(x) f(x)计算原像是难的。典型的例子是哈希函数)是存在的,我们就可以基于单向函数构造伪随机数生成器。单向函数存在这一假设是很弱的假设。另外,已经有很多的伪随机数生成器(比如流密码),而且目前还没找到高效的 D D D

流密码

流密码和伪随机数生成器有一点不同:它可以生成任意多的“随机”比特。

我们定义流密码为两个函数: ( I n i t , G e t B i t s ) (Init, GetBits) (Init,GetBits)

  • Init入参包括:种子 s s s和(可选的)初始化向量 I V IV IV。输出一个初始状态 x 0 x_0 x0
  • GetBits的入参包括:状态 x k x_k xk,输出一个比特 y k y_k yk然后更新状态为 x k + 1 x_{k+1} xk+1

于是,如果我们让流密码在初始化后运行 l l l G e t B i t s GetBits GetBits,就可以得到一个可能的“伪随机数生成器”,记为 G l G_l Gl

粗略地说,上面的流密码是安全的,如果它不需要 I V IV IV,并且对于任意的多项式 l ( n ) l(n) l(n),其中 l ( n ) > n l(n) > n l(n)>n G l G_l Gl都是扩张因子为 l l l的伪随机数生成器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/65768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Electron+vue3项目使用SQLite3数据库

SQLite 是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;我们不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不是一个独立的进程&am…

leetcode 738. 单调递增的数字

2023.8.4 这题用暴力法会超时&#xff0c;我就没试了&#xff0c;采用了个挺巧的方法&#xff0c;为了方便需要先将整数n转换为字符串的形式&#xff0c;然后从后向前遍历&#xff0c;当两个数字非递增时&#xff0c;将前一个数字--&#xff0c;后一个数字的位置记录在index中&…

Hybrid技术的下一站是什么?

Hybrid这个词&#xff0c;在App开发领域&#xff0c;相信大家都不陌生。Hybrid App是指介于web-app、native-app这两者之间的app&#xff0c;它虽然看上去是一个Native App&#xff0c;但只有一个UI WebView&#xff0c;里面访问的是一个Web App。Hybrid在移动领域的发展&#…

基于 CentOS 7 构建 LVS-DR 群集以及配置nginx负载均衡

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、前期准备 1、关闭防火墙 2、安装ifconfig 3、准备四台虚拟机 2、在DS上 2.1、配置LVS虚拟IP 2.2、手工执行配置添加LVS服务并增加两台RS 2.3、查看配置 3、在RS端&#xff08;第三台、第四台&#xff09; 上 3.1、配置W…

C数据结构与算法——二叉树 应用一

实验任务 (1) 掌握二叉树的二叉链表存储结构定义&#xff1b; (2) 掌握该存储方式下的二叉树基本算法&#xff1b; (3) 掌握三种遍历的递归算法。 实验内容 实现二叉链表存储结构及其基本算法算法简单应用 创建一颗二叉树的二叉链表输出该二叉树的三种遍历序列&#xff08;前…

flutter-第三方组件

卡片折叠 stacked_card_carousel 扫一扫组件 qr_code_scanner 权限处理组件 permission_handler 生成二维码组件 pretty_qr_code 角标组件 badges 动画组件 animations app更新 app_installer 带缓存的图片组件 cached_network_image 密码输入框 collection 图片保存 image_g…

前端安全XSS和CSRF讲解

文章目录 XSSXSS攻击原理常见的攻击方式预防措施 CSRFCSRF攻击原理常见攻击情景预防措施&#xff1a; CSRF和XSS的区别 XSS 全称Cross Site Scripting&#xff0c;名为跨站脚本攻击。为啥不是单词第一个字母组合CSS&#xff0c;大概率与样式名称css进行区分。 XSS攻击原理 不…

ppt压缩文件怎么压缩最小?文件压缩技巧分享

在日常的工作和学习中&#xff0c;难免会遇到PPT太大&#xff0c;需要将其压缩变小的情况&#xff0c;但很多朋友还不知道怎么压缩PPT文件&#xff0c;下面就给大家分享几个简单的方法&#xff0c;分分钟缩小过大的PPT文件。 一、PowerPoint PowerPoint就是微软公司的演示文稿…

无涯教程-Perl - gethostent函数

描述 此函数遍历主机文件中的条目。它在列表context中返回以下内容-($name,$aliases,$addrtype,$length,addrs) 语法 以下是此函数的简单语法- gethostent返回值 此函数在错误时返回undef,否则在scalrcontext中返回主机名,在错误时返回空列表,否则在列表context中返回主机…

基于CAS的单点登录实践之路

前言 上个月我负责的系统SSO升级&#xff0c;对接京东ERP系统&#xff0c;这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案&#xff0c;不过最主流的还是基于CAS的方案&#xff0c;所以我也就分享一下我的CAS实践之路。 什么是单点登录 单点登录的…

怎么进行流程图制作?用这个工具制作很方便

怎么进行流程图制作&#xff1f;流程图是一种非常有用的工具&#xff0c;可以帮助我们更好地理解和展示各种复杂的业务流程和工作流程。它可以将复杂的过程简化为易于理解的图形和文本&#xff0c;使得人们更容易理解和跟踪整个流程。因此&#xff0c;制作流程图是在日常工作中…

抑郁症与肠道微生物群有何关联

谷禾健康 抑郁症肠道菌群 当一个人面临抑郁症时&#xff0c;一切看似平常的事都会变得很有挑战性。上班、与朋友社交&#xff0c;甚至只是起床都感觉很困难。 抑郁症是如今已是世界上最普遍的精神障碍之一&#xff0c;一直是心理学和医学领域的研究热点。抑郁症是一种需要预防和…

探索 TypeScript 元组的用例

元组扩展了数组数据类型的功能。使用元组&#xff0c;我们可以轻松构造特殊类型的数组&#xff0c;其中元素相对于索引或位置是固定类型的。由于 TypeScript 的性质&#xff0c;这些元素类型在初始化时是已知的。使用元组&#xff0c;我们可以定义可以存储在数组中每个位置的数…

浪潮服务器硬盘指示灯显示黄色的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 宁夏某市某单位的一台浪潮服务器&#xff0c;该服务器中有一组由6块SAS硬盘组建的RAID5阵列。 服务器上存放的是Oracle数据库文件&#xff0c;操作系统层面划分了1个卷。 服务器故障&初检&#xff1a; 服务器在运行过程中有两块磁盘的指示灯…

虹科方案 | 成都大运会进行时,保障大型活动无线电安全需要…

成都大运会 7月28日&#xff0c;备受关注的第31届世界大学生夏季运动会在成都正式开幕。据悉&#xff0c;这是全球首个5G加持的智慧大运会&#xff0c;也是众多成熟信息技术的综合“应用场”。使用基于5G三千兆、云网、8K超高清视频等技术&#xff0c;在比赛现场搭建多路8K摄像…

《UNIX 传奇:历史与回忆》读后感

《UNIX 传奇&#xff1a;历史与回忆》 是 bwk&#xff08;Brian W. Kernighan&#xff09;2019 年的新作&#xff0c;回忆了 UNIX 在大半个世纪的风雨历程&#xff0c;是一本引人入胜的书籍。通过对 UNIX 操作系统的历史和发展进行详细的叙述和回顾&#xff0c;让我对这个操作系…

vue table动态合并, 自定义合并,参照合并,组合合并

<template><div><el-table:data"tableData":span-method"objectSpanMethod"border:header-cell-style"{ textAlign: center }"><el-table-column prop"area" label"区域" align"center">…

java动态生成excel并且需要合并单元格

java动态生成excel并且需要合并单元格 先上图看一下预期效果 集成poi <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.0.0</version> </dependency> <dependency><…

为什么Mendix的OQL比SQL更方便,以及如何实现类似MySQL的workbench?

前言 在当今信息时代&#xff0c;数据的价值变得越来越重要。数据处理是任何软件系统都非常关注的核心功能。无论是电子商务网站、移动应用程序还是企业管理系统&#xff0c;这些系统都需要处理和管理大量的数据。例如&#xff0c;当用户在电子商务网站上搜索特定商品时&#…

无涯教程-Perl - formline函数

描述 格式功能和相关的运算符使用此功能。它根据PICTURE的内容将LIST格式化为输出累加器变量$^ A。写入完成后,该值将写出到文件句柄中。 语法 以下是此函数的简单语法- formline PICTURE, LIST返回值 该函数总是返回1。 Perl 中的 formline函数 - 无涯教程网无涯教程网提…