辛辛苦苦的劳动成果,如何上把锁?

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 辛辛苦苦的劳动成果,如何上把锁?

宁教我负天下人,休叫天下人负我。

大家都知道枭雄曹操,错杀了吕伯奢之后的这句名言 - 宁教我负天下人,休叫天下人负我。把这句话写在这里,并不表示我们同意他的观点,而是这种人从古至今,由中而外,大有人在。看看周围,不法侵占别人劳动成果的事情,比比皆是。所以我们能做的,可能就是以小人之心,度小人之腹,尽可能多加防范。

就拿工程师们来说,干一个项目,画板子调程序,辛辛苦苦几个月,甚至一年半载的,产品终于上市大卖开始赚钱。这时候如果有人把程序读出来,然后复制出产品,卖得还更便宜,实在是一件让人吐血的事情。

把程序加密,无疑是一个防小人的好办法。我们这里介绍一种比较流行的加密方式,它利用芯片里的唯一识别码,为每一个MCU单独授权,这样即使程序被读出,也没有办法在其它的MCU上运行。我们讲一下它的工作原理,以及一款可以实现加密量产,可以授权烧写次数的工具。

  1. 一种流行的加密方法

如上图中所示,MCU中一般都有一个UDID(Unique Device IDentifier),这个唯一识别码,每一个MCU都是不一样的,烧写工具可以读出这个UDID,然后通过算法,计算出一个授权(License),烧写MCU程序(APP)时,连同这个授权码一起写入Flash。当MCU上电运行时,也读取自己的UDID,然后通过同一算法,计算出授权码,并和工具写入的授权码做对比,如果不相同就拒绝执行下面的程序。下面举个例子。

如图,三个MCU的UDID分别为1,3,5。通过一种算法计算出1和3的授权码分别为0和4。从1和3号读出的程序,写入5号是无法运行的。因为我们会发现,程序用5计算出的授权码,不等于0也不等于4,无法通过比对,程序无法继续运行。

那么我们能根据1和3的已知信息,反推出算法吗?可以试试看,经过一番猜测,我们发现一个算法,(UDID–1)*2 对于1号和3号MCU完全适用。我们不由得一阵兴奋!经过计算(5-1)*2=8,我们把8写入5号MCU的授权地址,然后发现程序并没有运行???

怎么回事?因为算法是猜测的。我们完全可以反推出另外一种算法:(UDID-1)*(UDID-1)。对于1和3也是适用的,但对于5,结果是16。

对于简单的数字尚且如此,而UDID一般长度有16个字节,用户再混入自己的密钥数字,用加减乘除,异或等运算计算出授权,想要逆向推测出算法还是很难的。如果想要进一步增加安全性,可以采用更高级别的加密算法。

为了增加逆向分析的难度,还可以在用户程序中综合采取一些措施。比如:不直接读取UDID和授权码,而是用两个地址运算生成读取地址;使用inline内联函数;多次校验并延时触发等。

加密算法

对称加密

加密和解密使用同一密钥。所以发送端和接收端都要对密钥严格保密。对称加密好处是运算速度快。常用的有DES,3DES,AES,以及我国的SM1。

非对称加密

它的密钥分为公钥和私钥,公钥是公开的,但是从公钥无法推导出私钥。非对称加密的好处是,只需要保密私钥就行了。其缺点是消耗资源比较多,运算速度慢。常用的有RSA,ECC以及我国的SM2。

反过来,我们也可以用私钥加密,然后用公钥解密,这种方式通常用来完成签名的验证。把MCU的UDID读出来,用私钥加密生成授权码,和应用程序一起写入MCU的Flash,然后MCU的应用程序就可以用公钥完成授权码的验证。采用非对称加密算法的好处是,即使算法是公开的,公钥也是公开的,别人只要没有获得私钥,就没办法为其它MCU生成授权码。

加密算法的安全性

首先想个问题,如果我们给家里装个防盗门,是越坚固的越好吗?好像没毛病。但仔细一想还真不是这样,我们大多数家里安装的,并不一定是市场上最好最贵的。

加密算法也没有绝对的安全。理论上只有一次一密,也就是采用跟明文长度一样密钥,而且只使用一次,才是绝对的安全。所以我们采用什么算法,要根据我们的实际需要。在一定时间长度内,如果破解的代价远大于所获得的价值,我们就认为是安全的。还有就是尽可能使用长一些的密钥,跟踪密码学的最新动态。

安全单片机和普通单片机

对于任何加密方式,密钥的存储是安全的关键。对于普通的单片机,现在一般在Flash区都会有保护字节,可以设置成编程后无法读出。密钥存储在里面,通过常规手段是无法读到的。但是对于非常规手段,这种安全性就不够了。

但是对于非常规手段,就无效了。比如把MCU的外壳溶解掉,然后暴露出内部的硅片,这样就可以直接观察,修改里面存储的内容。所以对于安全等级高的应用,比如金融等,也要求MCU具有更高级别的安全防范措施。这种MCU会把密钥存储在一小块儿RAM里,用电池供电。为了保证存储在RAM里的密钥不被非法读走,采取各种防范措施。比如芯片外部有探测引脚,一旦发现外部电路被破坏,马上销毁密钥。在芯片内部,用金属丝网包住关键区域,一旦被破坏,也会销毁密钥。同时这种MCU内部也会集成随机数生成,硬加密算法模块等,加速加解密的运算速度。

采用哪种单片机,也要根据实际需要来决定。

加密量产工具

创芯工坊的Power Writer,是一款挺实用的量产烧录工具。它可以通过MCU的唯一识别码,对每一个MCU生成单独的授权。加密算法有消耗资源特别少的向量矩阵加密,也有加密级别更高的ECDSA椭圆数字签名算法,还支持用户使用自己的算法。除此之外,他还能授权烧写的MCU个数,烧写MCU的UDID范围等。用户可以把程序上传到云端,客户联网在线获得授权,进行芯片烧录,也可以把程序加载进烧写器,用户采用离线烧录。

相关文章
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
35 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL使用行级锁时,并非直接锁定记录,而是锁定涉及的索引。对于表`user_item`,更新语句先锁定非主键索引`idx_1`,再锁定主键索引。若两条更新语句分别按不同顺序锁定这两个索引,可能导致互相等待对方释放锁,引发死锁。解决方案包括先查询待更新记录的主键,再按主键更新,确保一致的锁定顺序。
41 2
|
3月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
38 0
临键锁引发的死锁
|
6月前
|
存储 安全 Java
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
76 1
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
|
Linux API C++
锁、避免死锁等相关
锁、避免死锁等相关
67 0
《锁》有那些?
锁是计算机科学中用于控制对共享资源的访问的一种同步机制。不同种类的锁适用于不同的场景和需求。下面是一些常见的锁的种类及其详细介绍:
72 1
|
数据可视化 Java
lock锁和死锁
lock锁和死锁
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
138 0
|
存储 对象存储
|
PHP
并发锁(二):共享锁和独占锁
并发锁(二):共享锁和独占锁
214 0
并发锁(二):共享锁和独占锁