yaml加配置文件后起不来_趟坑记: yaml多行配置之痛

本文记录了在yaml配置文件中遇到多行文本解密后无法正确解析的问题及解决方案。问题源于yaml解析时会将换行符替换为空格,导致配置失效。提出的两种方案分别是:1) 在加密前将换行符替换为'n',解密后yaml会将其转义为换行;2) 每个换行后添加空行,yaml会将连续两个换行压缩为一个。总结指出,yaml的语法在动态修改时可能带来困扰,建议提供更灵活的字符串处理机制。
摘要由CSDN通过智能技术生成

问题

在项目中有一个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 Strings​yaml-multiline.info The Official YAML Web Site​yaml.org

及时获取更多原创文章请关注公众号"DANG下时光"

02ac79580cc18e267928aabcfd135c4f.png

转载说明:

原创不易,转载不能修改或移除本文的任何信息,并需要在显眼处保留本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值