如何保护Pi上的软件以用于商业用途?


16

我想在商业产品中使用Raspberry Pi,但是我想防止对设备上的软件进行逆向工程。有问题的软件将用Ruby编写。我认为最终用户可以物理访问SD卡,并且足够聪明,可以对Pi进行根访问。

如我所见,选项可能包括:

  • 加密部分(或全部)SD卡
  • 混淆Ruby代码或将其编译为字节码(JRuby或Rubinius)

加密将是最好的解决方案,但是我想不出一种不要求用户提供密钥的解密方法。代码混淆无疑是可能的,但在我看来不太安全。

是否可以在不提示用户解密密钥的情况下加密SD卡的一部分?还是有更好的方法来确保只能在所需的设备上访问代码?


我正在寻找类似的解决方案。我得到的最佳答案是安装在引导后使用某些条件进行加密的映像(分区)(也许是像DRM这样的ajax调用以提供动态解密密钥,带有锁定算法的序列号((SN * date-1)))-仅另一种方法是使用可以将您的代码编译为二进制文件的代码-如c ++或.net(单声道),并希望优秀的软件破解者不会将您的软件作为目标-您知道原因,例如Microsoft一直以来都没有出现此问题。解决了..祝你好运!
Piotr Kula 2012年

Answers:


8

当然可以解密加密的文件/容器/等。无需输入密码。将(加密的)密码存储在SD卡上并用它来解密您的数据就足够了。例如,一个简单的openssl演示可以是:

openssl enc -a -e -salt -aes-256-cbc -pass pass:abc123 -in /tmp/plaintext.txt -out /tmp/ciphertext.enc

openssl enc -d -a -aes-256-cbc -pass pass:abc123 -in /tmp/ciphertext.enc

加密将在将软件安装到Pi上时执行,解密将在运行时(可能在RAM中)执行。例如,密码可以是一些伪随机序列号(您知道)和从那里获得的特定Pi的序列号的组合cat /proc/cpuinfo。然后,您必须找到一个适当的隐藏位置来存储此伪随机数,该伪随机数对于所有意图和目的都是“ 密码 ”,因此也是整个加密机制的弱点。例如,SD上的备用扇区是典型的选择,但是您甚至可以将其嵌入到您的一个可执行文件中。

无论如何,最好的选择是同时加密和编译软件,为软件添加不同的混淆层。

最后,如果您的软件需要Internet连接,您甚至可以让Pi每次都要求输入密码。您仍然需要将密码隐藏在连接内部,还必须使用密码,并且必须使用加密https的当前时间来防止回复攻击salt

您有很多(便宜的)选择可以使软件安全。但是,您必须知道,如果您的软件达到了明确定义的普及度阈值,则即使您在保护软件上投入了大量资金,也肯定会破解该软件。


1
我可以root用户身份以安全模式登录,读取密钥文件并解密他所有的辛苦工作,然后以数百万美元的价格卖给俄罗斯人。好尝试..但不是防弹的。甚至https都可以在托管网络中使用DNS重定向和伪造的证书来欺骗。.哎呀
Piotr Kula 2012年

1
@Avio:首先,该领域并不未知。必须知道,它在哪里并不明显。但是由于您需要使用一些解密脚本/应用程序来找到它,因此可以找到它。您必须将要解密的代码放在某处。你会放在哪里?在initramfs中,某些SD卡分区或其他不受保护的位置。任何人都可以看到用于解密加密分区的应用程序/脚本,并且/或者可以在执行之前更改它们以获取某种访问权限。
2012年

1
您的所有加密方法都很好-除非密钥存储在SD卡上。运营商最有可能希望将Pi的SD卡出售给最终用户。然后,我可以拿起SD卡,对其进行暴力破解,利用,以安全模式扎根-读取密钥文件,并渗透所有其他设备的通信和源代码。那就是难题。我确定OP知道如何加密内容。他询问如何保护自己的软件免遭解密,同时让系统自动对其进行解密。
Piotr Kula 2012年

1
@Avio:不,不是。但是既然你问“怎么办?”,我就回答了。不知道这是一个反问。您写道,实现您的想法足以开始分发应用程序,但是我认为OP(和其他阅读此文档的人)应该只知道这种方法的弱点。话虽如此,我不相信Raspberry Pi会有更好的解决方案。唯一可以做的就是混淆更多。也许OP应用程序太珍贵,无法冒险,他决定使用RPi之外的其他东西,从而可以创建更好的保护机制。
2012年

1
尽管此处的所有答案都很好地讨论了与我的问题相关的权衡和挑战,但由于它具有最具体的解决方案,因此我现在将接受该答案。使用/ proc / cpuinfo中的序列号可能是缺少的链接。
Schrockwell 2012年

6

实际上,如果代码和密钥是SD卡的机器上,他们能够去编译它,他们能够发现钥匙,他们能够提取敏感数据。

这就像加密电影一样,DVD必须包含解密电影所需的所有信息,以便可以将其显示给观众,因此所有电影复制保护机制最终都注定要失败。

您能做的最好的就是改变对产品进行反向工程的经济性。

加密和/或模糊处理值得吗?

现在我们已经确定没有办法完全保护自己,问题变成了

  1. 这发生的可能性有多大?
  2. 您的算法和数据对其他人有什么价值?
  3. 他们购买使用您的软件的许可证的费用是多少?
  4. 他们复制您的算法和数据对他们有何代价?
  5. 他们对您的算法和数据进行逆向工程对他们有何代价?
  6. 保护您的算法和数据对您而言有何代价?

如果这些对保护您的算法/数据产生了重要的经济影响,那么您应该考虑这样做。例如,如果服务的价值和客户的成本都很高,但是对代码进行反向工程的成本远低于自己开发代码的成本,那么人们可能会尝试这样做。

因此,这导致了您的问题

  • 您如何保护算法和数据?

混淆

您建议的选项混淆了代码,使上面的内容不合时宜-它试图显着增加它们的成本(以上5),而又不增加您的成本(6)。问题在于,与DVD加密一样,它注定会失败,并且如果3、4和5之间的差异足够大,那么最终有人会这样做。

另一种选择是Steganography形式,它使您可以确定谁解密了您的代码并开始分发它。例如,如果您有100个不同的float值作为数据的一部分,并且每个值的LSB出现1位错误都不会对您的应用程序造成问题,请对这些位编码一个(针对每个客户)唯一的标识符。问题是,如果某人可以访问您的应用程序数据的多个副本,则很明显,它们是不同的,从而使识别隐藏消息更加容易。

保护

唯一真正安全的选择是提供软件即服务的关键部分,而不是将其包含在应用程序中。

从概念上讲,您的应用程序将收集运行算法所需的所有数据,将其打包为对云中服务器(由您控制​​)的请求,然后您的服务将计算结果并将其传递回客户端,将显示它。

这会将您所有的专有,机密数据和算法保留在完全控制的域内,并且消除了客户端提取其中任何一个的可能性。

明显的不利之处在于,客户端受您的服务供应的约束,受服务器及其Internet连接的支配。从好的方面来说,它们始终是与最新的错误修复程序。不幸的是,正是由于这些原因,许多人反对SaaS

不过,这将是迈出的一大步,而且成本可能高达6,但这是我看到的确保算法和数据完全安全的唯一方法。


SaaS可能是一种选择,但是您必须意识到,您需要对每个联机的服务器重新检查1到6点。您还会遭受DDoS攻击。
Avio 2012年

4

我最近为这个无法解决的问题发明了非常优雅的解决方案。它的灵感来自于此xkcd漫画:

在此处输入图片说明

因此,该解决方案称为超级胶水。如果将一张超级胶粘SD卡粘贴到PI,则几乎不可能在不损坏卡的情况下将其拔出。

您甚至可以使用外部SSD磁盘,并使用存储在SD上的密码进行加密,并且安全无虞!

在此处输入图片说明


有人可以轻松地dd从中创建图像文件(),并相应地使用它!
Vassilis

@Vassilis没有登录就不可能了吗?
ADOConnection

任何拥有实时linux映像的人都可以做到!这是没有必要为根您的系统。
瓦西里斯(Vassilis)

@Vassilis请问你点任何一篇文章,解释这个程序请
的ADOConnection

想出了对谷歌第一件事就是这个
瓦西里斯

2

编译为字节码将是最好的选择。至于加密,软件可以存储在TrueCrypt卷中,但前提是用户没有获得root访问权限。由于可以随时转储进行检查的内存/磁盘,因此无法安全地存储密码。如果软件在用户有大量linux实用程序的地方运行,那么即使是安全设备(智能卡)的帮助也不会起作用。据我所知,R-Pi上没有安全启动选项,这会阻止用户在OS内部进行修补。


1
引导期间的加密没有您想象的那么安全。您只需要访问/绕过正常的系统启动,这简直就是碎肉。甚至Blurays都没有做到这一点..该死!
Piotr Kula 2012年

只有完全封闭的系统才能保护您的应用程序。我只知道一个这样的东西,它有点可编程-Java卡。
Tomas Q.

1
是的-但是您始终必须输入PIN码-PIN码永远不会存储在卡上。
Piotr Kula 2012年

1

如果您想制作一个真正的商业应用程序,那么Pi最终用户形式将对您不利!

您将必须设计自己的PCB,例如使用Pi上的处理器,然后在PCB上嵌入闪存。

  1. 为BCM编写一个适当的固件,该固件根据某些最高机密算法生成一次登录代码,该算法只能在接下来的10秒内使用。
  2. 使用专有软件编译您自己的内核,并启用一些Linux功能,这些功能使您可以从闪存上的加密文件中挂载根文件,该文件包含软件的另一个加密分区。(双重保护)
  3. 您的BCM固件将基于一些聪明的算法或公钥生成一次关闭身份验证密钥的最高机密信息,并将其传递给您的自定义linux内核,这将加载加密的根分区,并在启动过程中执行更多加密操作,以加载加密的软件驱动器在加密图像中。

提示

  • 好的身份验证密钥的长度不能超过8-16个字符。使用更多的系统符号(HEX)和更少的字符(ASCII)来提供256/512字节长的身份验证密钥非常重要
  • 不要使用AES,TKIP,因为它很容易破解
  • 截至目前-使用256/512密钥破解最复杂的惠而浦加密
  • 即使黑客可以删除闪存驱动器或转储内容。您的软件已加密两次。
  • 如果他们截取了auth密钥,则很难从固件中删除(因为BCM可以防止固件转储)
  • 一些聪明的ROM还具有防止完全内存转储的功能。
  • 如果您要设计PCB,则将实现(如Dell和Apple)安全芯片,该芯片可提供所有加密数据和密钥并防止暴力破解。一些戴尔具有自毁功能,可用于军事用途。如果您输入的BIOS密码输入错误2次,​​则会使用散弹炸弹擦拭驱动器。如果检测到身份验证密钥操作,则可以实现相同的功能。

一天结束。Raspberry Pi用于教育目的,目的是让孩子们学习如何使用Linux并编写一些程序。

它不适合用于高端商业用途。您需要制造自己的设备并配备自己的保护系统。因为如果只有您一个人和其他人都不知道您如何保护自己的礼节性信息,那么有人使用已知的漏洞利用或蛮横手段对其进行黑客入侵的机率是0.001%

备择方案

  • 编写您的软件,以便可以将其编译为二进制格式并部署到目标系统。在.NET,Java或JAR上运行的Windows的示例EXE(在Linux,C ++中不确定吗?)
  • 请记住,您想要的安全性越好-您将不得不花更多的钱。没有例外。

1

解决方案之一是使用RaspberryPi的MAC地址,该地址对于给定的Pi几乎是唯一的。在代码中验证该地址并提供编译后的版本。这将使逆向工程变得困难。

对于盲目地将SD卡复制到新卡上的人,它将无法在另一台Pi上使用。这将使绝大多数人窃取您的软件。其他有足够聪明的人可能会打破这一点,他们也许有足够的聪明来重新制作该软件,他们并不多,而且我认为他们不会损害您的销售。



0

为什么不将基于SPI的闪存添加到载板上并在其中存储代码?我正在为自己的产品考虑此选项。万一SD损坏了,我希望最终用户能够写一个新的文件,其中包括一个自定义的raspbian,以及安装SPI闪存并运行可执行文件的代码。

另一种选择是将加密密钥存储在RTC中。大多数RTC芯片都有一定的存储空间,可以使用密钥对它们进行预编程,该密钥允许从SD或SPI闪存解锁和挂载可执行文件。


-4

我相信Raspberry Pi系列中使用的所有CPU都支持自己的安全启动。我相信需要12伏才能重新刷新pi本身没有的内部闪存或EEPROM的4,8,16,32或64K。通过他们,您可以使用代码设置Trustzone,以便看不到所有好东西。我还了解到,两种形式的静态RAM仅在给定的重写次数下才稳定。我的第一步是拥有一个备用CPU,然后尝试重新刷新此安全启动内存几个小时或几天。最终,所有位都固定了,因此没有其他人可以修改您的代码,并且根据实际产品,您可以定期要求2要素标识(例如存储库),以便产品吐出代码并将重新激活代码发送到电子邮件地址。如果你稍微修改一下pi,我相信ARM也有CPUID,因此它们是您可以寻求的许多安全级别。我的意思是,您也可以提供特定号码的短信。有很多方法。


1
你好,欢迎光临。有很多猜测,并相信那篇文章。在建议人们为Pi使用12 V电压之前,强烈建议提供更详细的答案,并通过适当的参考文献对其进行支持。
加纳玛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.