文本上的复杂操作
除了简单的字符串匹配之外,您还可以配置检查字符串长度和文本块中的模式而不是特定字符串的表达式。
对于任何基于文本的操作,请注意以下几点:
- 对于任何需要字符串参数的操作,字符串不能超过 255 个字符。
- 在表达式中指定字符串时,可以包含空格。
对字符串长度的操作
以下操作按字符数提取字符串。
字符计数操作 | 说明 |
---|---|
<文本> .TRUNCATE(<统计>) |
按<数> 中的字符数截断目标末尾后返回一个字符串。如果整个字符串小于<数> ,则不返回任何内容。 |
> <文本。截断(<人物> ,<数> ) |
按<数> 中指定的字符数截断<人物> 后面的文本后返回一个字符串。 |
> <文本。前缀(<人物> ,<数> ) |
选择目标中最多出现<数> 次的<人物> 的最长前缀。 |
> <文本。后缀(<人物> ,<数> ) |
选择目标中最多出现<数> 次的<人物> 的最长后缀。例如,考虑以下响应正文:jLewX。以下表达式返回值“jlewX”:http.res.body (100) .suffix (' L ', 1)以下表达式返回“llewX”:http.res.body (100) .suffix (' L ', 2) |
> <文本。SUBSTR (< starting_offset >, <长度> ) |
从目标对象中选择一个包含<长度> 字符数的字符串。在< starting_offset > 之后开始提取字符串。如果偏移后的字符数少于<长度> 参数的值,请选择所有剩余的字符。 |
> <文本。跳过(<人物>,<统计>) |
跳过最多出现<数> 次的<人物> 最长前缀后,从目标中选择一个字符串。 |
对字符串的一部分进行操作
请参阅字符串操作表,了解如何使用其中一个操作来提取较大字符串的子集。
用于比较两个字符串的字母数字顺序的操作
比较操作检查两个不同字符串的第一个不匹配字符。此操作基于词典顺序,这是在字典中对术语进行排序时使用的方法。
此操作返回比较字符串中第一个不匹配字符的ASCII码值之间的算术差值。以下区别是示例:
- “abc”和“和”之间的区别为-1(基于第三对字符比较)。
- @“和”abc“之间的区别为-33。”
- “1”和“abc”之间的区别为-47。
以下是比较操作的语法。
<文本> .COMPARE(<字符串>)
从表示文本的字节字符串中提取整数
请参阅整数提取表,了解如何将表示文本的字符串视为字节序列,从序列中提取 8 位、16 位或 32 位,然后将提取的位转换为整数。
将文本转换为散列值
您可以使用哈希函数将文本字符串转换为哈希值。作为操作的结果,此函数返回一个 31 位正整数。以下是表达式的格式:
> <文本。哈希
此函数忽略大小写和空格。例如,在操作之后,两个字符串Ab c和bc将产生相同的哈希值。
通过应用Base64编码算法对文本进行编码和解码
以下两个函数通过应用Base64编码算法对文本字符串进行编码和解码
功能 | 说明 |
---|---|
文本。B64ENCODE | 通过应用Base64编码算法对文本字符串(由文本指定)进行编码。 |
文本。B64DECODE | 通过应用Base64解码算法对Base64编码的字符串(由文本指定)进行解码。如果文本不是b64编码格式,则该操作将引发undef。 |
使用extext函数在重写操作中优化搜索
文本函数用于指定模式或模式集并针对HTTP数据包主体的重写操作。找到模式匹配后,exende函数将搜索范围扩展到匹配字符串两侧的预定义字节数。然后,可以使用正则表达式对此扩展区域中的匹配项执行重写操作。与仅使用正则表达式评估整个HTTP主体的重写操作相比,使用扩展函数配置的重写操作执行重写的速度更快。
EXTEXT函数的格式为EXTEXT (m, n),其中m和n分别是在匹配模式之前和之后扩展搜索范围的字节数。找到匹配项后,新的搜索范围包括紧接在匹配字符串之前的m个字节,字符串本身和字符串后面的n个字节。然后可以使用正则表达式对这个新字符串的一部分执行重写操作。
只有在使用exnext函数的重写操作满足以下要求时,才能使用该函数:
- 搜索是通过使用模式或模式集(而不是正则表达式)执行的
- 重写操作仅评估HTTP数据包的正文。
此外,exext函数只能与以下类型的重写操作一起使用:
- replace_all
- insert_after_all
- delete_all
- insert_before_all
例如,您可能想要删除正文前1000个字节中的所有"http://exampleurl.com/“和”http://exampleurl.au/实例。为此,您可以配置重写操作来搜索字符串exampleurl的所有实例,在找到匹配项时扩展字符串两侧的搜索范围,然后使用正则表达式在扩展区域中执行重写。以下示例将匹配字符串的搜索范围向左扩展 20 个字节,向右扩展 50 个字节:
添加重写动作delurl_example delete_all 'HTTP.REQ.BODY(1000)' -search exampleurl -refineSearch 'extend(20,50).regex_select(re#http://exampleurl.(com|au)#)'
将文本转换为十六进制格式
以下函数将文本转换为十六进制格式并提取生成的字符串:
<文本> .BLOB_TO_HEX(<字符串>)
例如,此函数将字节字符串" abc "转换为" 61:62:63 "。
加密和解密文本
在高级策略表达式中,您可以使用加密和解密函数来加密和解密文本。由给定Citrix ADC设备或高可用性(HA)对上的加密函数加密的数据旨在通过同一Citrix ADC设备或HA对上的解密函数进行解密。该设备支持rc4, des3, aes128, aes192和aes256加密方法.输出说明加密所需的密钥值不是用户可指定的。设置加密方法后,设备会自动生成适用于指定方法的随机密钥值。默认方法是 AES256 加密,这是最安全的加密方法,也是 Citrix 推荐的方法。
除非要更改加密方法或希望设备为当前加密方法生成新的密钥值,否则无需配置加密。
注意:您还可以加密和解密XML有效负载。有关加密和解密XML有效负载的函数的信息,请参阅加密和解密XML有效负载。
配置加密
在启动期间,设备默认使用AES256加密方法运行设置ns EncryptionParams命令,并使用随机生成的适用于AES256加密的密钥值。设备还会加密密钥值,并将带有加密密钥值的命令保存到Citrix ADC配置文件中。因此,默认情况下,为加密和解密函数启用aes256加密方法。即使设备每次重新启动时都会运行命令,保存在配置文件中的键值仍然存在。
如果要更改加密方法或希望设备为当前加密方法生成新的密钥值,则可以手动运行设置ns EncryptionParams命令,或者使用配置实用程序。要使用cli更改加密方法,请仅设置方法参数,如"示例 1:更改加密方法中所示。“如果希望设备为当前加密方法生成新的密钥值,请将方法参数设置为当前加密方法,将keyValue参数设置为空字符串(" "),如“示例 2:为当前加密方法生成新的密钥值中所示。生成新的键值后,必须保存配置。如果不保存配置,则设备仅在下次重新启动之前使用新生成的密钥值,之后它将恢复为保存的配置中的键值。
使用GUI配置加密
- 导航到”系统“>”设置”。
- 在“设置“区域中,单击”更改加密参数”。
- 在“更改加密参数对话框中,执行以下操作之一:
- 要更改加密方法,请在“方法”列表中,选择所需的加密方法。
- 要为当前加密方法生成新的密钥值,请单击为所选方法生成新密钥。
- 单击”确定”。
使用加密和解密函数
您可以将加密和解密函数用于任何返回文本的表达式前缀。例如,您可以在Cookie加密的重写策略中使用ENCRYPT和DECRYPT函数。在以下示例中,重写操作会加密由后端服务设置的名为 myCookie 的 cookie,并在客户端返回该 Cookie 时解密相同的 cookie:
替换“HTTP.RES.SET_COOKIE.COOKIE(“MyCookie”).VALUE(0)”“HTTP.RES.SET_COOKIE.COOKIE (MyCookie) value(0)。加密" add rewrite action my-cookie-decrypt-action replace "HTTP.REQ.COOKIE.VALUE("MyCookie")" "HTTP.REQ.COOKIE.VALUE("MyCookie").DECRYPT"
为加密和解密配置策略后,请保存配置以使策略生效。
为第三方加密配置加密密钥
在高级策略表达式中,您可以使用加密和解密函数来加密和解密请求或响应中的文本。设备(独立,高可用性或群集)上由加密函数加密的数据旨在由同一设备使用解密函数进行解密。设备支持RC4, DES、3 d AES92和AES256加密方法,每种方法都使用私有密钥进行数据加密和解密。您可以使用这些方法中的任何一种方法通过两种方式加密和解密数据-自加密和第三方加密。
设备(独立、高可用性或群集)中的自我加密功能通过评估标头值来加密然后解密数据。理解这一点的一个例子是HTTP Cookie加密。该表达式评估标头,加密传出响应中set - cookie标头中的HTTP cookie值,然后在客户端随后传入请求的饼干标头中返回cookie值时对其进行解密。密钥值不是用户可配置的,而是在设置ns EncryptionParams命令中配置加密方法时,设备会自动为配置的方法生成随机密钥值。默认情况下,该命令使用AES256加密方法,这是高度安全的方法,Citrix建议使用此方法。
第三方加密功能使用第三方应用程序对数据进行加密或解密。例如,客户端可能会对请求中的数据进行加密,而设备会在将数据发送到后端服务器之前对其进行解密,反之亦然。要执行此操作,设备和第三方应用程序必须共享密钥。在设备上,您可以使用加密密钥对象直接配置私有密钥,设备会自动生成密钥值以实现更强的加密。在第三方设备上手动配置相同的密钥,以便设备和第三方应用程序都可以使用相同的密钥来加密和解密数据。
注意:使用第三方加密,您还可以加密和解密XML负载。有关用于加密和解密XML负载的函数的信息,请参阅"加密和解密XML负载"。
密码方法
密码方法提供两种函数:一种是将明文字节序列转换为密文字节序列的加密函数,另一种是将密文转换回明文的解密函数。密码方法使用称为密钥的字节序列来执行加密和解密。使用相同密钥进行加密和解密的密码方法称为对称方法。使用不同密钥进行加密和解密的密码方法是不对称的。非对称密码最引人注目的例子是公钥加密,它使用任何人都可以使用的公钥进行加密,使用只有解密者才知道的私钥。
如果你没有密钥,好的密码方法使得解密(“破解”)密文是不可行的。“不可行”实际上意味着破解密码文本将花费比其价值更多的时间和计算资源。随着计算机变得更强大、更便宜,以前无法破解的密码变得更加可行。此外,随着时间的推移,密码方法(或其实现)中会发现缺陷,从而使破解变得更加容易。因此,较旧的密码方法更受欢迎。通常,长度较长的密钥比较短的密钥提供更好的安全性,但代价是加密和解密时间更长。
密码方法可以使用流密码或分组密码。Rc4是最安全的流密码,仅用于旧版应用程序。分组密码可以包括填充。
串流密码
流密码方法对单个字节进行操作。Citrix ADC- 设备上只有一个流密码可用:RC4,它使用 128 位(16 字节)的密钥长度。对于给定的密钥,RC4 会生成一个伪随机的字节序列,调用密钥流,该密钥流与明文进行 X 或以生成密文。RC4 不再被认为是安全的,只有在传统应用程序需要时才应使用。
块密码
分组密码方法在固定的字节块上运行。Citrix ADC设备提供两种块密码:数据加密标准 (DES) 和高级加密标准 (AES)。DES 使用 8 字节的块大小和(在 Citrix ADC 设备上)两种密钥长度选择:64 位(8 字节),其中 56 位为数据,8 位为奇偶校验,三重 DES,192 位(24 字节)密钥长度。AES 的块大小为 16 字节,(在 Citrix ADC 上)有三种密钥长度选择:128 位(16 字节)、192 位(24 字节)和 256 位(32 字节)。
填充
如果分组密码的明文不是块的整数,则可能需要填充更多字节。例如,假设明文是“xyzzy”(十六进制78797a7a79)。对于8字节的Triple-DES块,必须填充此值才能创建8个字节。填充方案必须允许解密函数在解密后确定原始明文的长度。以下是目前正在使用的一些填充方案(n是添加的字节数):
- PKCS7:每个字节相加n个字节的值。例如,78797a7a79030303。这是OpenSSL和ENCRYPT()策略函数使用的填充方案。Pkcs5的填充方案与pkcs7相同。
- ANSI X.923:添加n-1个零字节和值n的最后一个字节。例如,78797a7a79000003。
- ISO 10126:添加n-1个随机字节和值n的最后一个字节。例如,78797a7a79xx03,其中xx可以是任何字节值。解密() 策略函数接受此填充方案,这也允许它接受 PKCS7 和 ANSI X.923 方案。
- ISO/IEC 7816-4:添加一个0x80字节和n-1个零字节。例如,78797a7a79800000。这也称为OneAndZero填充。
- 零:添加n个零字节。示例:78797a7a79000000。这只能用于不包含 NUL 字节的明文。
如果使用填充并且明文是块的整数,则通常会添加一个额外的块,以便解密函数可以明确地确定原始明文长度。对于pcks7和8字节的块,这将是080808080808080808080808。
操作模式
分组密码有许多不同的操作模式,它们指定了多个明文块的加密方式。某些模式使用初始化向量(iv),除了用于启动加密过程的明文数据块之外的数据块。最好对每个加密使用不同的iv,这样相同的明文会产生不同的密文。Iv不需要是秘密的,因此要在密文之前加上。模式包括:
- 电子密码本(欧洲央行):每个明文块都是独立加密的。没有使用如果明文不是密码块大小的倍数,则需要填充。相同的明文和密钥始终生成相同的密文。因此,欧洲央行被认为不如其他模式安全,只能用于传统应用程序。
- 密码块链(cbc):在加密之前,每个明文块都使用先前的密文块或第一个块的iv进行xor。如果明文不是密码块大小的倍数,则需要填充。这是与Citrix ADC加密Params方法一起使用的模式。
- 密码反馈(CFB):先前的密文块或第一个模块的IV已加密,输出与当前的明文块进行XOR以创建当前密文块。反馈可以是 1 位、8 位或 128 位。由于明文与密码文本是xor的,因此不需要填充。
- 输出反馈(ofb):通过将密码连续应用于iv并使用明文对键流块进行xor来生成密钥流。填充不是必需的。
为第三方加密配置加密密钥
以下是在配置加密密钥时执行的配置任务。
- 添加加密密钥。为具有指定密钥值的指定密码方法配置加密密钥。
- 修改加密密钥。您可以编辑已配置的加密密钥的参数。
- 取消设置加密密钥。将已配置的加密密钥的参数设置为默认值。名称为的EncryptionKey值必须存在。将填充设置为默认(由方法确定),删除现有的静脉,这会导致加密()生成随机四世。删除现有评论。无法重置方法和键值。
- 删除加密密钥。删除已配置的加密密钥。密钥不能有任何引用。
- 显示加密密钥。显示已配置的加密密钥或所有已配置密钥的参数。如果省略了该名称,则不会显示键值。
使用cli添加加密密钥
在命令提示符下,键入:
add ns encryptionKey
其中,
= (NONE | RC4 | DES3 | AES192 | AES192 | AES256 | DES | DES- cbc | DES- cfb | DES- ofb | DES- ecb | DES3- cbc | DES- cfb | DES3- ofb | DES3- ecb | AES128- cbc | AES128- cfb | AES128- ofb | AES128- ecb | AES192- cbc | AES192- cfb | AES192- ecb | AES256- cbc | AES256- cfb | AES256- ofb | AES256- ecb) =十六进制编码的字节序列
上述加密方法指定了以CBC为默认操作模式的操作模式。因此,des, des2, aes128, aes192和aes256方法等同于des - cbc, des3-cbc, aes128 - cbc, aes192 - cbc和方法。AES256-CBC
使用cli修改加密密钥
在命令提示符下,键入:
set ns encryptionKey
使用cli取消设置加密密钥
在命令提示符下,键入:
unset ns encryptionKey
使用cli删除加密密钥
在命令提示符下,键入:
rm ns encryptionKey
使用cli显示加密密钥
在命令提示符下,键入:
示例:
show ns encryptionKey [] add ns encryptionKey my_key -method aes256 -keyValue 26ea5537b7e0746089476e5658f9327c0b10c3b4778c673a5b38cee182874711 -iv c2bf0b2e15c15004d6b14bcdc7e5e365 set ns encryptionKey my_key -keyValue b8742b163abcf62d639837bbee3cef9fb5842d82d00dfe6548831d2bd1d93476 unset ns encryptionKey my_key -keyValue b8742b163abcf62d639837bbee3cef9fb5842d82dfe6548831d2bd1d93476 ns encryptionKey my_key名称:my_key方法:aes256 Padding: DEFAULT Key值:(not encrypted)
使用GUI添加加密密钥
导航到”系统“>”加密密钥",然后单击"添加创建加密密钥。
使用GUI修改加密密钥
导航到系统>加密密钥,然后单击编辑以修改已配置的加密密钥的参数。
使用GUI删除加密密钥
导航到系统>加密密钥,然后单击删除。
用于第三方加密的加密和解密函数
以下是用于第三方加密的加密函数。
加密(encryptionKey out_encoding)
其中,
设备的输入数据是要加密的文本
EncryptionKey:一个可选的字符串参数,它指定已配置的加密密钥对象以提供加密方法,私有密钥值和其他加密参数。如果省略,该方法将使用与设置ns cryptionParams命令关联的自动生成的密钥值。
out_encoding:此值指定如何对输出进行编码。如果省略,则使用base64编码。
输入:
6位(0..63)编码为一个ASCII字符:0..23 = ' ' . .“Z”,24 . .51 = ' ' . .“z”,52 . .61 = ' 0 ' . .'9', 62 =' +', 63 =' /', '=' = pad byte。BASE64 -encoding:与BASE64相同,除了62 = '-',63 = '_'以外。9 = ' 0 ' . .“9”和10 . .15 = ' '。' F '。HEX_LOWER:带0..的十六进制9 = ' 0 ' . .“9”和10 . .15 = ' '。' f '。 HEX_COLONS: Hexadecimal with 0..9 = '0'..'9' and 10..15 = 'A'..'F'; ':' between each hex byte. Matches BLOB_TO_HEX() output format HEX: For input, accepts HEX_UPPER, HEX_LOWER, and HEX_COLONS format. For output, produces HEX_LOWER format
输出:输出是使用指定方法和密钥加密并使用指定输出编码进行编码的文本。它在需要IV的块方法和模式的加密文本之前插入生成的静脉,并且没有为EncryptionKey指定IV或省略EncryptionKey。
以下是用于第三方解密的解密函数。
解密(encryptionKey in_encoding)
其中,
输入数据是使用指定方法和使用指定输入编码进行编码的密钥的加密文本。第四对于需要的阻止方法和模式,预计此文本将在加密文本之前包含生成的静脉,并且未为EncryptionKey指定IV或省略EncryptionKey。
cryptionKey——一个可选的字符串参数,用于指定已配置的EncryptionKey对象以提供加密方法,私有密钥和其他加密参数。如果省略,将使用与cryptionParams设置关联的方法和自动生成的密钥
In_encoding—一个可选枚举参数,用于指定输入的预期编码方式。这些值与ENCRYPT的out_coding相同。如果省略,将需要使用base64编码。
输出数据是未编码的解密文本。
变体和可选参数
以下是带有可选参数的这些函数的变体:
变体 | 说明 |
---|---|
加密 | 使用加密Params命令和BASE64输出编码参数。 |
加密(out_encoding) | 使用EncryptionParams和指定的输出编码参数。 |
加密(encryptionKey) | 使用指定的EncryptionKey和BASE64输出编码参数。 |
加密(encryptionKey out_encoding) | 使用指定的EncryptionKey和输出编码参数。 |
解密 | 使用加密参数命令和base64输入编码参数。 |
解密(out_encoding) | 使用cryptionParams命令和指定的输入编码参数。 |
解密(encryptionKey) | 使用指定的EncryptionKey和BASE64输入编码参数。 |
解密(encryptionKey out_encoding) | 使用指定的EncryptionKey和输入编码参数。 |
配置hmac密钥
Citrix ADC设备支持哈希消息身份验证码(HMAC)函数,该函数通过使用消息发件人和消息接收者之间共享的密钥来计算输入文本的摘要方法或哈希值。摘要方法(源自RFC 2104技术)对发件人进行身份验证,并验证邮件内容是否未被更改。例如,当客户端向Citrix ADC设备发送带有共享HMAC密钥的消息时,高级(PI)策略表达式使用HMAC函数计算所选文本上的基于哈希的代码。然后,当接收者收到带有密钥的消息时,它将通过将其与原始HMAC进行比较来重新计算HMAC,以确定消息是否已被更改。Hmac功能受独立设备以及高可用性配置或群集中的设备的支持。使用它类似于配置加密密钥。
添加ns hmackey组和ns hmackey命令包含一个参数,该参数指定用于HMAC计,算的摘要方法和共享密钥。
要配置hmac密钥,必须执行以下操作:
- 添加hmac密钥。使用指定的键值配置hmac密钥。
- 修改hmac密钥。修改已配置的hmac密钥的参数。摘要方法可以在不更改键值的情况下进行更改,因为键值长度不是由摘要决定的。但是,建议在更改摘要时指定一个新的密钥。
- 取消设置hmac密钥。将已配置的hmac密钥的参数设置为默认值。名称为的HmacKey对象必须存在。唯一可以取消设置的参数是注释,该注释将被删除。
- 删除hmac密钥。删除已配置的密钥。密钥不能有任何引用。
- 显示hmac密钥。显示已配置的HMAC ac密钥或所有已配置密钥的参数。如果省略了该名称,则不会显示键值。
配置唯一的随机hmac密钥
您可以自动生成唯一的hmac密钥。如果您的设备是群集配置,则会在流程开始时生成hmac密钥,并将其分发给所有节点和数据包引擎。这样可以确保群集中的所有数据包引擎和所有节点的hmac密钥相同。
在命令提示符下,键入:
添加ns hmacKey
示例:
add ns hmacKey
其中,
- 名称语法正确,不会复制现有密钥的名称。
- 可以在设置命令中使用“自动”KeyValue来为现有的EncrytionKey和HmacKey对象生成新密钥。
注意:
如果Citrix ADC设备正在使用密钥加密和解密数据,或者生成和验证HMAC密钥,则自动生成密钥非常有用。由于密钥值本身在显示时已经加密,因此您无法检索生成的密钥值供任何其他方使用。
示例:
添加ns hmacKey my_hmac_key -digest sha1 -keyValue 0c753c6c5ef859189cacdf95b506d02c1797407d
上述加密方法指定了以CBC为默认操作模式的操作模式。因此,des, des2, aes128, aes192和aes256方法等同于des - cbc, des3-cbc, aes128 - cbc, aes192 - cbc和方法。AES256-CBC
使用cli修改hmac密钥
此命令修改为hmac密钥配置的参数。您可以在不更改键值的情况下更改摘要,因为键值长度不是由摘要决定的。但是,建议在更改摘要时指定一个新的密钥。在命令提示符下,键入:
set ns hmacKey [-digst ] [-keyValue ] [-comment ]
使用cli取消设置hmac密钥
此命令使用默认值设置为hmac密钥配置的参数。名称为的HmacKey对象必须存在。唯一可以取消设置的参数是注释选项,该选项已被删除。在命令提示符下,键入:
unset ns hmacKey
使用cli删除hmac密钥
此命令删除已配置的hmac密钥。密钥不能有引用。在命令提示符下,键入:
rm ns hmacKey
使用cli显示hmac密钥
在命令提示符下,键入:
show ns encryptionKey [] add ns hmacKey my_hmac_key -digest sha1 -keyValue 0c753c6c5ef859189cacdf95b506d02c1797407d set ns hmacKey my_hmac_key -keyValue f348c594341a840a1f641a1cf24aa24c15eb1317 rm ns hmacKey my_hmac_key name: my_hmac_key Digest: sha1 Key Value:(未披露)