谷动谷力

 找回密码
 立即注册
查看: 1616|回复: 0
收起左侧

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

[复制链接]
发表于 2023-5-9 23:28:16 | 显示全部楼层 |阅读模式
辛辛苦苦的劳动成果,如何上把锁?
8 a2 X4 z% W) D
# p% p' a0 K6 h( `+ O
& C9 P, O' ?, k9 G
宁教我负天下人,休叫天下人负我。8 a* a* ^7 r9 m  v

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

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

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

! v" g1 w  b; d
一种流行的加密方法
& d% F/ h; I; Y0 G

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

! D( V2 i; _+ E; _1 i. _/ m" u1 z; w
如图,三个MCU的UDID分别为1,3,5。通过一种算法计算出1和3的授权码分别为0和4。从1和3号读出的程序,写入5号是无法运行的。因为我们会发现,程序用5计算出的授权码,不等于0也不等于4,无法通过比对,程序无法继续运行。

5 w3 ]1 z- K2 d9 q# U' y- [
那么我们能根据1和3的已知信息,反推出算法吗?可以试试看,经过一番猜测,我们发现一个算法,(UDID–1)*2 对于1号和3号MCU完全适用。我们不由得一阵兴奋!经过计算(5-1)*2=8,我们把8写入5号MCU的授权地址,然后发现程序并没有运行???
; `4 f5 d) A# |% I6 Y1 E
怎么回事?因为算法是猜测的。我们完全可以反推出另外一种算法UDID-1)*(UDID-1)。对于1和3也是适用的,但对于5,结果是16。
$ r! F* K0 J! ~( B! m" C
对于简单的数字尚且如此,而UDID一般长度有16个字节,用户再混入自己的密钥数字,用加减乘除,异或等运算计算出授权,想要逆向推测出算法还是很难的。如果想要进一步增加安全性,可以采用更高级别的加密算法。

0 W) G- h/ a: v3 `
为了增加逆向分析的难度,还可以在用户程序中综合采取一些措施。比如:不直接读取UDID和授权码,而是用两个地址运算生成读取地址;使用inline内联函数;多次校验并延时触发等。
1 u8 U3 G/ G! d4 ^4 n: z1 L4 P
加密算法# _6 a/ g6 s. M7 g4 {9 c1 o
8 |' E  `0 c! ]8 S9 F
对称加密
0 N+ U% c7 K. ]5 q: d" O
加密和解密使用同一密钥。所以发送端和接收端都要对密钥严格保密。对称加密好处是运算速度快。常用的有DES,3DES,AES,以及我国的SM1。
640?wx_fmt=jpeg.jpg
非对称加密

: K3 V5 F( _# ~. e* Z
它的密钥分为公钥和私钥,公钥是公开的,但是从公钥无法推导出私钥。非对称加密的好处是,只需要保密私钥就行了。其缺点是消耗资源比较多,运算速度慢。常用的有RSA,ECC以及我国的SM2。
640?wx_fmt=jpeg.jpg

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

% d) b& a, Q! Z6 S
加密算法的安全性
9 m$ b7 k* E* Z0 |
首先想个问题,如果我们给家里装个防盗门,是越坚固的越好吗?好像没毛病。但仔细一想还真不是这样,我们大多数家里安装的,并不一定是市场上最好最贵的。

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

/ n+ C- c$ ?* D! [, s- O
安全单片机和普通单片机
* b+ S: q) p2 C
对于任何加密方式,密钥的存储是安全的关键。对于普通的单片机,现在一般在Flash区都会有保护字节,可以设置成编程后无法读出。密钥存储在里面,通过常规手段是无法读到的。但是对于非常规手段,这种安全性就不够了。

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

7 f5 w) X8 H5 U+ I* s) T% g& F  k
采用哪种单片机,也要根据实际需要来决定。
来源:TopSemic嵌入式
# l/ q* l' W0 g/ J
# C( R% N7 J+ n4 m3 a
9 _. ^$ K- \- g2 V0 s; _2 s- F1 x0 e

* h' K7 C5 j' d+ E5 ~0 B
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-3-29 14:38 , Processed in 0.094408 second(s), 37 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表