SLS 数据加工“数据编码、解码”实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 在数据的生命周期基本可以概括为生成、传输、计算、存储、展示这么几个流程,每个流程可能会重复执行。在这整周期中,为了便捷性、安全性、执行效率等各个方面的考量,我们会引入各种各样的编码方式,比如图片的JPEG格式、文本的UTF-8编码、访问网址参数需要URL编码等。

引文

在数据的生命周期基本可以概括为生成、传输、计算、存储、展示这么几个流程,每个流程可能会重复执行。在完整周期中,为了满足便捷性、安全性、执行效率等各个方面的考量,我们会引入各种各样的编码方式,比如图片的JPEG格式、文本的UTF-8编码、访问网址参数需要URL编码等。
简单来说,计算机所能表达的数据都是以0和1构成的二进制内容,某种数据编码方式就是遵循某个数据使用者都认可的标准或者协议,而协议存在的最根本意义就在于不同的使用者能够的到准确的数据内容。数据的编码和解码过程,就是将满足标准的A的数据转换到B协议的过程。
这里我们对 SLS 数据加工中关于数据编码和解码的场景做一个汇总,主要分为编码与解码、压缩与解压缩、加密与解密、哈希摘要 4 个部分。

数据转换

在编程语言中存在赋值操作,即是将内存中的数据块添加一个名字,方便编程语言中使用。类似的,在 SLS 数据加工中,将数据赋值为字段值可以通过 e_set 函数完成,比如 e_set("field_name", "field_value"),或者 e_set("field_name", v("another_field_name")),这里 v 的作用是提取对应字段的值。

编码、解码

字符串编码

对于开发人员来说,字符串的编码是最常见的编码场景,也是非常让人头疼的问题,ASCII、Unicode、UTF-8、GB232 ,各种各样字符和的编码傻傻分不清楚,动不动就乱码。这里对于字符的编码原理不做细究,针对看一下数据加工提供的能力。

  1. 将字符串编码为二进制数据

原始数据:

content: "SLS 数据加工"

加工规则(为了做展示,这里进一步将二进制数据编码为16进, 下文会进一步讨论):

e_set("i_am_binary", op_add("0x", bin2hex(str_encode(v("content"), "utf8"))))

加工结果,这里 i_am_binary 字段所表示的二进制为 \x22\x53\x4c\x53\x20\xe6\x95\xb0\xe6\x8d\xae\xe5\x8a\xa0\xe5\xb7\xa5

content: "SLS 数据加工"
i_am_binary: 0xe695b0e68daee58aa0e5b7a522
  1. 将二进制数据编码为字符串

原始数据:

i_am_binary: 0xe695b0e68daee58aa0e5b7a522

加工规则,直接对二进制参数做转换

e_set(
    "content",
    str_decode(
        b"\x22\x53\x4c\x53\x20\xe6\x95\xb0\xe6\x8d\xae\xe5\x8a\xa0\xe5\xb7\xa5",
        encoding="utf-8",
    ),
)

加工结果:

content: "SLS 数据加工

Hex 格式

上文所说,计算机所表示的数据是二进制,也就是说数据中有很多内容是用作特殊功能的,这部分内容没办法直接做展示,但是我们在传输过程中很有可能需要做临时展示,这时就可以将数据内容转换为16进制字符串。
将二进制数据转为hex字符串,上文【字符串编码】部分已经有样例.

Base64 格式

上文所述,可以将不可见内容编码为 hex 格式,同样的能力,Base64 则可以实现更少的编后大小,提高效率。

  1. 将字符串编码为Base64数据

原始数据:

content: "SLS 数据加工"

加工规则:

e_set("i_am_base64", base64_encoding(v("content")))

加工结果:

content: "SLS 数据加工"
i_am_base64: IlNMUyDmlbDmja7liqDlt6Ui
  1. 将Base64数据解码为字符串数据

原始数据:

i_am_base64: IlNMUyDmlbDmja7liqDlt6Ui

加工规则:

e_set("content", base64_decoding(v("i_am_base64")))

加工结果:

content: "SLS 数据加工"
i_am_base64: IlNMUyDmlbDmja7liqDlt6Ui

HTML 格式

  1. 将原始数据编码为符合 html 标准(转义)的字符串

原始数据:

str : <img src="test.jpg" alt="" width="300" height="194" />

加工规则:

e_set("i_am_base64", base64_encoding(v("content")))

加工结果:

str:<img src="test.jpg" alt="" width="300" height="194" />
str_html_en: "<img src="test.jpg" alt="" width="300" height="194" />"
  1. 将 html 转移后的内容,转为原始数据
  2. 将原始数据编码为符合html标准(转义)的字符串

原始数据:

str_html_en: "<img src="test.jpg" alt="" width="300" height="194" />"

加工规则:

e_set("str", html_decoding(v("str_html_en")))

加工结果:

str: <img src="test.jpg" alt="" width="300" height="194" />
str_html_en: "<img src="test.jpg" alt="" width="300" height="194" />"

URL 格式

  1. 将原始数据编码为符合 url 标准(转义)的字符串

原始数据:

query: "x=0,y=1,z=2"

加工规则:

e_set("i_am_base64", base64_encoding(v("content")))

加工结果:

query: "x=0,y=1,z=2"
query_encoded: "x%3D0%2Cy%3D1%2Cz%3D2"
  1. 将 url 转移后的内容,转为原始数据

原始数据:

query_encoded: "x%3D0%2Cy%3D1%2Cz%3D2"

加工规则:

e_set("query", url_decoding(v("query_encoded")))

加工结果:

query: "x=0,y=1,z=2"
query_encoded: "x%3D0%2Cy%3D1%2Cz%3D2"

压缩、解压缩

Gzip 压缩库

Deflate 压缩算法应用非常广泛,gzip 则是封装了 deflate 算法,添加了协议头和协议尾,方便使用。

  1. 将数据做压缩,并输出压缩后的 base64 编码

原始数据:

content: "I always look forward to my holidays whether I travel or stay at home."

加工规则:

e_set("gzip_compress", gzip_compress(v("content"), to_format="base64"))

加工结果:

gzip_compress: "H4sIAOCOyGEC/xXK0QmAMAwFwFXeBO7RMQKNREx5kAZDtle/7wbES3rDyRsnoyQmklgNo1/ztzJN08BAhjzqYGCnNCS/tPR4AcgrnWVGAAAA"
content: "I always look forward to my holidays whether I travel or stay at home."
  1. 将压缩数据(base64 编码)解压缩

原始数据:

content: "H4sIAOCOyGEC/xXK0QmAMAwFwFXeBO7RMQKNREx5kAZDtle/7wbES3rDyRsnoyQmklgNo1/ztzJN08BAhjzqYGCnNCS/tPR4AcgrnWVGAAAA"

加工规则:

e_set("gzip_decompress", gzip_decompress(v("content"), from_format="base64"))

加工结果:

content: "H4sIAOCOyGEC/xXK0QmAMAwFwFXeBO7RMQKNREx5kAZDtle/7wbES3rDyRsnoyQmklgNo1/ztzJN08BAhjzqYGCnNCS/tPR4AcgrnWVGAAAA"
gzip_decompress: "I always look forward to my holidays whether I travel or stay at home."

Zlib 压缩库

Zlib 同样是封装了 deflate 算法,它兼容了 gzip 的封装头和尾。

  1. 将数据做压缩,并输出压缩后的 base64 编码

原始数据:

content: "I always look forward to my holidays whether I travel or stay at home."

加工规则:

e_set("zlib_compress", zlib_compress(v("content"), to_format="base64"))

加工结果:

zlib_compress: "eJwVytEJgDAMBcBV3gTu0TECjURMeZAGQ7ZXv+8GxEt6w8kbJ6MkJpJYDaNf87cyTdPAQIY86mBgpzQkv7T0eAGNshln"
content: "I always look forward to my holidays whether I travel or stay at home."
  1. 将压缩数据(base64 编码)解压缩

原始数据:

content: "eJwVytEJgDAMBcBV3gTu0TECjURMeZAGQ7ZXv+8GxEt6w8kbJ6MkJpJYDaNf87cyTdPAQIY86mBgpzQkv7T0eAGNshln"

加工规则:

e_set("zlib_decompress", zlib_decompress(v("content"), from_format="base64"))

加工结果:

content: "eJwVytEJgDAMBcBV3gTu0TECjURMeZAGQ7ZXv+8GxEt6w8kbJ6MkJpJYDaNf87cyTdPAQIY86mBgpzQkv7T0eAGNshln"
zlib_decompress: "I always look forward to my holidays whether I travel or stay at home."

加密、解密

AES 加密算法

数据加密是数据安全最基本的保障,AES加密算法应该是作为目前对称加密算法的标准(弥补了DES算法的强度不足),其实现包含了多种数据分组模式,比如 EBC、CBC等等。

  1. 将数据做加密,并输出压缩后的 base64 编码

原始数据:

content: "I always look forward to my holidays whether I travel or stay at home."

加工规则:

e_set(
    "aes_encrypt",
    aes_encrypt(
        v("content"),
        "this is my key..",
        iv=b"xxywosjdapdiawdk",
        output_format="base64",
    ),
)

加工结果:

aes_encrypt: "/3mAdvqWORQkPKgfMvW/IkGBwMRvJSI8Qkyqkr0RJWuRRx8s//qgIq3PMDe6Y/p4Au/sXpe45Bjx0I8fENAgMA1Z9WfG4kIWK5TOShJZYMk="
content: "I always look forward to my holidays whether I travel or stay at home."
  1. 将加密后的数据(base64 编码)解压缩

原始数据:

content: "/3mAdvqWORQkPKgfMvW/IkGBwMRvJSI8Qkyqkr0RJWuRRx8s//qgIq3PMDe6Y/p4Au/sXpe45Bjx0I8fENAgMA1Z9WfG4kIWK5TOShJZYMk="

加工规则:

e_set(
    "aes_decrypt",
    aes_decrypt(
        v("content"), 
        "this is my key..", 
        iv=b"xxywosjdapdiawdk", 
        input_format="base64",
    ),
)

加工结果:

aes_decrypt: "I always look forward to my holidays whether I travel or stay at home."
content: "/3mAdvqWORQkPKgfMvW/IkGBwMRvJSI8Qkyqkr0RJWuRRx8s//qgIq3PMDe6Y/p4Au/sXpe45Bjx0I8fENAgMA1Z9WfG4kIWK5TOShJZYMk="

哈希摘要

MD5 哈希

数据摘要(哈希)一般用于数据正确性验证(防篡改),md5 是较为经典的哈希算法,在哈希均匀程度上表现优异。
将数据做 md5 哈希:
原始数据:

content: "I always look forward to my holidays whether I travel or stay at home."

加工规则:

e_set("md5_hash", md5_encoding(v("content"), format="hex"))

加工结果:

content: "I always look forward to my holidays whether I travel or stay at home."
md5_hash: 30a07986f2d3e6a3692c1cb89e222b69

SHA1 哈希

SHA1 族哈希函数相对于 md5 有更强的反碰撞能力(更安全),包括 SHA256、SHA384、SHA224、SHA512。
将数据做 sha1 哈希:
原始数据:

content: "I always look forward to my holidays whether I travel or stay at home."

加工规则:

e_set("sha1_hash", sha1_encoding(v("content"), format="sha512"))

加工结果:

content: "I always look forward to my holidays whether I travel or stay at home."
sha1_hash: f3c65fa56113673674e0e630cdff1f365f3e64904a31b0fdae865c7b425178f33f5387b657aa520813be64cb4c2afede5bc39a59276fff29d211384dfa68dd91

总结

以上列出的是的数据编码方式的转化实践,数据的编码和解码还包含更加高级的应用,比如 json、csv、xml、yaml 等,SLS 数据加工也有相应的解决方案,这里先不做讨论。
下图是 SLS 团队的技术博客,我们会不定期推出技术文章分享和产品更新介绍,欢迎大家订阅,有任何问题也欢迎与我们反馈。
SLS QR.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
129 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
11天前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
云上数据安全保护:敏感日志扫描与脱敏实践详解
|
1天前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
152 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
1月前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
|
2月前
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
139 15
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
361 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
15天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
336 3