问题
在项目中有一个yaml格式的配置文件,其中某项配置内容是多行文本,假设内容如下:
req:|
-----BEGIN CERTIFICATE REQUEST-----
MIICmzCCAYMCAQAwVjELMAkGA1UEBhM0R0IxDjAMBgNVBAcMBUNoaW5hMQ8wDQYD==
+
LmlvMIIBIjAnbgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wDziKul3ncUvH0B
5dextHcaIzix+Ez/6gWdGSnwXPA34cwvg9kX4isjRyPRCAyQbzlcDdGt9XSMVYz5
K6d1rg2ICluUxxcuPZcPP0z8S33vjgBNcuzzhwF6EV0lCEZX4+XarklQtv7l+wh0
-----END CERTIFICATE REQUEST-----
由于安全原因,需要将该配置项进行加密,但是在程序使用该配置时必须完成解密,假设加密后的内容为:
req: "[ssss]xxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
程序实现解密的流程如下:扫描配置文件中带有密文标记的字符串,然后解密后进行原地替换。
那么经过解密后配置文件的内容为:
req: ”-----BEGIN CERTIFICATE REQUEST-----
MIICmzCCAYMCAQAwVjELMAkGA1UEBhM0R0IxDjAMBgNVBAcMBUNoaW5hMQ8wDQYD==
+
LmlvMIIBIjAnbgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wDziKul3ncUvH0B5de
xtHcaIzix+Ez/6gWdGSnwXPA34cwvg9kX4isjRyPRCAyQbzlcDdGt9XSMVYz5K6d1rg2
ICluUxxcuPZcPP0z8S33vjgBNcuzzhwF6EV0lCEZX4+XarklQtv7l+wh0
-----END CERTIFICATE REQUEST-----“
此时存在两个问题,一是配置文件本身的结构错误,换行符缺失了,二是该配置项是非法yaml格式,反解析失败。
现在的问题是在现有的解密流程下,如何实现解密后多行配置是合法且符合预期的配置内容。
问题分析
首先这个问题不是加解密本身的问题,因为加解密并不会去修改操作的数据,而且加解密是通用操作,也不应该为了某个具体场景而做特殊化的操作。
结合yaml的语法定义,为了保证最终得到符合预期的多行配置,则需要在加密的时候对原始内容做出适当的调整。为了保留最终配置项中换行符,就需要换行符在解密后处于转义状态,在yaml解析时再最终转换为实际的换行符。因为按照yaml的语法规则,在解析过程中会将换行符替换为空白符,这也是导致上述问题的原因。
此时需要充分利用yaml的双引号字符串的语义,将换行符替换为'n'
解决方案
将原需要加密的内容中的换行符替换为n, 这样会将多行内容变为单行内容,然后再进行加密处理。
解密后的单行内容为:
req: ”-----BEGIN CERTIFICATE REQUEST-----nMIICmzCCAYMCAQAwVjELMAkGA1UEBhM0R0IxDjAMBgNVBAcMBUNoaW5hMQ8wDQYD==n+nLmlvMIIBIjAnbgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wDziKul3ncUvH0B5denxtHcaIzix+Ez/6gWdGSnwXPA34cwvg9kX4isjRyPRCAyQbzlcDdGt9XSMVYz5K6d1rg2nICluUxxcuPZcPP0z8S33vjgBNcuzzhwF6EV0lCEZX4+XarklQtv7l+wh0n-----END CERTIFICATE REQUEST-----“
此时经过yaml解析时会进行转义处理,将n替换为换行符,就得到了符合预期的配置内容。
第二方案
上述的方案是先将换行符替换为n, 将多行变单行。第二个方案是在每个换行符后边增加一个空行,同样是利用了yaml的语法,即将连续两个换行符压缩为一个换行符。
总结
yaml格式的语法更多的是为了人类而设计的,当遇到需要通过程序来进行动态的修改或者生成的时候,这种语法反而会成为绊脚石。很多语言都提供了原生字符串的支持,即在字符串中可以包含任意特殊字符,而不需要转义。或许yaml也该考虑提供类似的机制。
参考文档
YAML Multiline Stringsyaml-multiline.info The Official YAML Web Siteyaml.org及时获取更多原创文章请关注公众号"DANG下时光"
转载说明:
原创不易,转载不能修改或移除本文的任何信息,并需要在显眼处保留本文链接