1 个不稳定版本
0.1.0 | 2020 年 4 月 30 日 |
---|
#1986 在 Rust 模式
9KB
slip
一个轻松的实用程序,用于加密公共二进制文件中的错误处理字符串,以保护您的业务逻辑。
此软件包不提供字符串的一般运行时混淆。请考虑使用类似 obfstr 的工具。
slip 做什么?
有时,人们希望确保某些业务逻辑难以逆向工程。但他们也希望它在生产环境中易于调试。然而,高质量的错误处理可能会通过错误字符串泄露程序的工作方式,给攻击者提供深入了解。slip 帮助解决这个特定问题。
slip 是一个 Rust 宏,它在编译时将错误字符串转换为加密令牌。攻击者只能接触到那些无法解密的令牌。然后,当错误返回到软件维护者时,他们将能够使用他们的密钥对其进行解密。unslip 实用程序是一个易于使用、易于自动化且透明的工具,用于解密令牌,即使在复杂的错误报告中也是如此。
slip 与自动化错误报告系统配合使用效果最佳,因此用户永远不会看到任何 slip 令牌,并可以享受具有自动化错误修复的优质产品。如果您有任何依赖项使用 slip,您也可以利用它,因为密钥是在全局范围内定义的(即使依赖项是第三方)。
安装
slip 是一个常规的 crates.io 软件包,可以使用 cargo 获取。
unslip 是一个二进制文件。您可以从 Linux 和 Windows(x64)的 GitHub 发布 下载它,或者克隆此仓库并使用 cargo 在您的系统上安装它。
cargo install --path unslip
使用
您首先需要生成一个密钥。您可以使用 unslip 做这件事,但任何随机的 16 字节十六进制字符串都可以。
$ unslip key
然后,您需要将此密钥设置为构建环境中的 SLIP_KEY
环境变量(请参阅下面的 重要注意事项)。
在 Linux 上,可以这样临时完成(变量将在您离开终端后消失)
$ export SLIP_KEY=<your key, without quotations>
在 Windows 上,可以这样临时完成(变量将在您离开终端后消失)
$ set SLIP_KEY=<your key, without quotations>
完成此操作后,slip 即可使用!请参阅示例了解如何使用宏,以及示例部分了解如何使用 unslip。
重要注意事项
- 更改您的 SLIP_KEY 值需要重建整个依赖树,以确保更改在所有地方都得到反映。这是因为增量编译,因为宏不会在冷代码上再次运行。因此,建议避免更改密钥。您可以在再次构建之前执行
cargo clean
来完全重建。 - 在发布模式下,如果未提供
SLIP_KEY
,宏将无法构建。在未加密密钥的情况下继续操作是预期行为(例如在公共依赖项中),应将allow-no-encryption
功能传递给 slip 依赖项。 - 不建议依赖于加密形式的令牌来识别它,因为其值是易变的(它可以在每次构建之间显著变化)。
- 当然,slip 不是防止逆向工程的神器。但希望它确实使这变得更困难。
寻求帮助
- 欢迎任何功能想法或改进!请随时提出改进的问题和拉取请求。
- 基准测试。虽然宏对构建时间的影响不应该很大(特别是在没有提供密钥的开发设置中,它什么也做不了),但我真的很想了解是否有必要找到比目前设置更高效的解决方案。实际上,最好的方式是分析它对较大代码库的影响。如果您恰好有一个,如果您能分享您的结果,那将非常感激!
- 这是我第一个过程宏,也许我并没有完全做对。特别是,我真的很希望返回的表达式被其他宏(如
concat!
)解释为字符串字面量,或者使宏能够接受不仅仅是字符串字面量,这是否可能?
示例
您可以在网络协议示例中找到如何在您的代码中使用宏(只需用宏包装您的字符串即可)。
slip!("this string will be encrypted!");
unslip 工具将您的密钥作为参数,从 stdin 读取要处理的数据,并将结果输出到 stdout。
例如,如果您将以下错误存储在 input.txt
...
thread 'main' panicked at '$slip:1:WA5mKhwP74N+g8KjAT6hEA==:J1IxgRDKGxAWyM+uwF4y3ZyRKvysUw==$: $slip:1:p6NIauAikdOUN1Iw5OCc9Q==:ZIqdMcLD4q2dsOKaWw==$[3, 1, 2]'
...然后运行...
$ unslip decrypt 15478569587452125874565845212565 < input.txt > output.txt
...output.txt
将包含以下友好的消息!
thread 'main' panicked at 'failed to parse packet: packet data: [3, 1, 2]'
许可证
根据 MIT 许可证授权(许可证或 http://opensource.org/licenses/MIT)。
依赖关系
~1MB
~18K SLoC