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

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


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

加密是最好的解决方案,但是我想不出一种不要求用户提供密钥的解密方法。代码混淆无疑是可能的,但是在我看来却不太安全。还是有更好的方法来确保只能在所需的设备上访问代码?

评论

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

#1 楼

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

无论如何,最好的选择是同时加密和编译软件,最后,如果您的软件需要互联网连接,您甚至可以让Pi每次都要求输入密码。您仍然需要将密码隐藏在连接内部,还必须使用https,并且必须使用当前时间作为加密对salt进行防范回复攻击。有很多(便宜的)选项可以使您的软件安全。但是,您必须知道,如果您的软件达到了明确定义的普及度阈值,那么即使您在软件保护上投入了大量资金,也肯定会破解该软件。

评论


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

– Piotr Kula
2012-10-22 22:41



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

– Krzysztof Adamski
2012年10月23日,9:43

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

– Piotr Kula
2012年10月23日上午10:05

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

– Krzysztof Adamski
2012年10月23日上午10:20

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

–施罗克韦尔
2012年10月24日14:10



#2 楼

混淆或保护是否值得取决于几个因素。

值得吗?

在考虑是否保护软件时,我们首先必须回答一个问题问题:


这种情况发生的可能性有多大?
您的算法和数据对其他人的价值是什么?
对他们来说这是什么代价购买使用软件的许可证?
他们复制算法和数据的成本是多少?
对他们的算法和数据进行反向工程的成本是什么?


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

因此,这引出了您的问题


如何保护算法和数据?

不鼓励

混淆
您建议的选项混淆了代码,与上面的经济学相混淆-它试图显着增加他们的成本(以上5),而又不增加您的成本(6)。加密功能中心的研究对此做了一些有趣的研究。问题是,与DVD加密一样,如果3、4和5之间的差异足够大,注定会失败,然后最终有人会这样做。

检测

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

保护

SaaS-软件即服务

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

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

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

缺点是客户端与您的服务供应有关,受服务器及其Internet连接的支配。不幸的是,正是由于这些原因,许多人反对SaaS。从好的方面来说,它们始终是最新的错误修复程序,并且您的计算群集的性能可能比运行用户界面的PC更高。

这将是巨大的一步可能需要花费6以上的巨额费用,但这是使算法和数据完全安全的几种方法之一。

软件保护加密狗

尽管传统软件保护软件狗可以防止软件盗版,也不能防止提取代码中的算法和数据。

较新的代码移植加密狗(例如SenseLock†)似乎可以执行您想要的操作。使用这些设备,您可以从应用程序中取出代码并将其移植到安全的加密狗处理器中。与SaaS一样,您的应用程序将捆绑数据,将其传递到加密狗(可能是连接到计算机的USB设备)并读取结果。

与SaaS不同,数据带宽不太可能是一个问题,但是您的应用程序的性能可能会受到SDP性能的限制。

†这是我可以在Google搜索中找到的第一个示例。

平台

将来可能成为可行的另一种选择是使用受信任的平台模块和受信任的执行技术来保护代码的关键区域。每当客户安装软件时,他们都会为您提供其硬件的指纹,并为他们提供该特定系统的解锁密钥。

然后,该密钥将允许对代码进行解密。并在受信任的环境中执行,其中在受信任的平台之外将无法访问加密的代码和数据。如果有关受信任环境的所有更改全部更改,则将使密钥失效,并且功能将丢失。

对于客户来说,这样做的好处是其数据保持本地状态,而他们不需要购买新的加密狗以提高性能,但有可能产生持续的支持要求,并且客户可能会为使用购买和购买的软件而不得不跳过的障碍感到沮丧-失去了良好的信誉。

结论

只有您能回答劝阻或保护经济学是否适合您的情况。但是,您寻求的保护越多,它就会越昂贵,因此您需要付出更多的损失才能证明其合理性。

评论


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

– Avio
2012年10月23日在10:48

#3 楼

我最近为这个无法解决的问题发明了一种非常优雅的解决方案。
它受到xkcd漫画的启发:



所以该解决方案被称为超级胶水。
如果将一张超级胶粘SD卡插入PI中,则几乎不可能在不损坏的情况下拔出该卡。

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



评论


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

–Vassilis
19年6月20日在15:03

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

– ADOConnection
19年6月21日在15:36

任何拥有实时linux映像的人都可以做到!不必成为系统的根。

–Vassilis
19年6月22日在10:27

我可以请@Vassilis指向任何说明此程序的文章

– ADOConnection
19年6月24日在10:35

在树莓派上,默认情况下禁用从USB引导,因此您将无法从实时CD引导并运行命令。这就是我的意思,您如何在不进行任何配置更改的情况下从实时CD启动...

– ADOConnection
19 Jun 25 '13:44



#4 楼

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

评论


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

– Piotr Kula
2012年10月22日在22:44



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

– TomasAdomavičius
2012年10月23日下午0:04

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

– Piotr Kula
2012年10月23日上午10:06

#5 楼

如果您想实现真正的商业应用,那么Pi最终用户的形式将对您不利!

您将必须设计自己的PCB,并使用以下处理器:例如,在Pi上将Flash存储器嵌入到PCB上。在接下来的10秒内使用。
使用专有软件编译您自己的内核,并启用一些Linux功能,这些功能使您可以从闪存上的加密文件中挂载root,该文件包含软件的另一个加密分区。(双重保护)
您的BCM固件一旦根据某些聪明的算法或公钥将auth密钥关闭,就会生成一个最高机密,并将其传递给您的自定义linux内核,这将加载加密的根分区,并在启动时进行更多加密在加密的映像中加载加密的软件驱动器。

TIPS


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

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

它不适合用于高端商业用途。您需要制造自己的设备并配备自己的保护系统。因为如果只有您一个人和其他人都不知道您如何保护自己的礼节性信息,那么有人使用已知的漏洞利用或蛮横手段对其进行黑客入侵的可能性就是0.001%
br />编写软件,以便可以将其编译并以二进制格式部署到目标系统。在.NET,JAR for Java或(不确定在Linux,C ++?)上运行的Windows的示例EXE。请记住,您想要的安全性越好-您将不得不花更多的钱。没有例外。


#6 楼

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

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

#7 楼

您可以使用基于搭载的解决方案:
Raspberry Pi的软件串行保护

评论


如果我错了,请纠正我,但此设备似乎并未为逆向工程添加任何保护。对CPU序列号进行简单的硬编码检查也可以做到这一点。

– EDP
2015年9月4日下午13:18

#8 楼

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

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

#9 楼

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

评论


你好,欢迎光临。有很多猜测,并相信那篇文章。在建议人们为Pi使用12 V电压之前,强烈建议提供更详细的答案,并通过适当的参考文献对其进行支持。

–加纳马♦
16年9月2日在22:04