国密算法科普:快餐店下单背后的三道安全门

国密算法科普:快餐店下单背后的三道安全门 用点外卖讲透SM2、SM3、SM4是干什么的你每天在快餐店App上点外卖时一笔简单的订单背后经过了三道国密算法的保护SM3帮你生成订单防伪码SM4把快餐装进密封快递袋SM2给订单贴上你的电子指纹证明是你本人下的单这篇文章不讲复杂的数学公式用点外卖这件事一次性搞懂国密三兄弟的分工。一、SM3订单防伪码你在App上选好辣堡、薯条、可乐点击下单。App生成一份订单同时根据订单内容算出一个校验码你可以把它理解成订单的防伪标签比如#A37。快餐店收到的是加密订单解密后得到明文辣堡薯条可乐按这个备餐。同时用SM3给订单内容算一个校验码跟订单一起存——一旦有人篡改订单比如把辣堡换成满汉全席校验码就对不上系统直接拒单。你拿到的是校验码#A37凭这个号取餐。这个校验码有三个特点看不出你点了什么给你#A37你猜不出是辣堡还是鸡翅饭换一样菜号码就完全变了把可乐换成九珍果汁#A37可能变成#B52长度固定不管你点多少东西校验码都一样长一次完整的点餐你提交订单 → 快餐店解密后用SM3算防伪码、同时按明文备餐 → 你收到防伪码凭号取餐。这个号是订单的防伪标记不是备餐依据。二、SM4外卖打包你点完外卖厨房按订单备餐。但在送出之前餐食要经过一套打包流程——把菜品分装进盒子再封进快递袋外面看不见里面是什么。2.1 分装盒SM4按16字节一组处理数据。就像把菜品按份分装每份装一个盒子每盒固定放一份16字节。不管这份是辣堡还是一包薯条盒子大小都一样。2.2 填充卫生隔板填满盒子仅ECB和CBC模式需要填充CTR和GCM不需要。如果最后一份只有5个字节塞不满标准盒子怎么办缺多少补多少——缺11个字节就放11块卫生隔板把盒子填满。收件人拆袋后隔板扔掉只取菜。2.3 四种打包方式ECB——不安全不要用每个盒子独立封口。两盒都装辣堡封口方式一模一样。坏人买过一次知道封口长这样的盒子里是辣堡。下次在别人订单里看到一模一样的封口就知道里面也是辣堡。CBC——可用但需要额外验货第N盒封口时参考第N-1盒封好之后的样子密文来决定封口方式。两盒都装辣堡但因为前面那盒的密文不同封口方式也完全不同。第一盒需要一个随机初始样式IV确保即使两单点的菜完全一样封口效果也完全不同。但如果整个袋子被掉包收件人发现不了。CTR——推荐每个盒子贴一个流水号001、002、003...每盒按自己的编号独立封装。一盒破损不影响其他盒速度也快。但同样存在整个袋子被掉包发现不了的问题。GCM——首选CTR 防伪封条。每个盒子贴流水号独立封装同时快递袋口贴一张防伪封条。收件人收到外卖封条破损或对不上 →直接拒收不拆袋封条完好 → 拆袋取出各盒看到菜品密封防伪一步到位。⚠️致命警告GCM虽好但IV初始化向量绝不能重复同一把钥匙同一个IV加密两次密钥直接泄露后果比ECB还严重。开发时务必用安全的随机数生成器。一句话新系统无脑选GCMECB直接拉黑。三、SM2订单签名SM4解决了外卖不被偷看的问题但还有一个问题快餐店怎么确认这单是你本人下的而不是别人用你的账号冒用的SM2的核心是两把钥匙私钥只存在你手机里相当于你的电子指纹保密公钥存在快餐店服务器上相当于你的指纹验证器公开这两把钥匙成对生成你用私钥在订单上按下指纹只有配对的公钥能验证这个指纹。下单流程你选好菜点击下单 → App生成订单数据App用你的私钥给订单按指纹签字画押订单连同指纹发给快餐店快餐店用你的公钥验证指纹通过 → 确认是你本人接单做菜不通过 → 拒绝为什么安全不可抵赖你没法否认下过这单因为只有你的私钥能按出这个指纹防篡改订单内容被改指纹就失效防冒用别人没有你的私钥没法冒充你四、三兄弟如何协同工作一笔完整的点外卖步骤谁做什么用什么①你选好菜点击下单-②App生成订单同时算防伪码SM3③App加密订单内容贴防伪封条SM4-GCM④App用你的私钥按指纹SM2⑤App把加密订单防伪码指纹发给快餐店-⑥快餐店验指纹→确认是你本人SM2⑦快餐店验封条→确认订单没被改SM4-GCM⑧快餐店验SM3校验码→确认未被篡改→备餐SM3⑨你凭防伪码取餐-五、常见问题Q1SM3和SM4有什么区别SM3是哈希——从校验码推不出你点了什么是单向的。SM4是加密——用密钥可以拆袋取餐也能重新封上是双向的。Q2SM2的签名和加密有什么区别签名用自己的私钥签别人用你的公钥验 → 证明这是我下的单加密用别人的公钥加密别人用自己的私钥解 → 保证只有你能看点外卖用的是签名。Q3为什么不直接用SM2加密订单SM2比SM4慢几百到几千倍。实际做法是SM4打包订单SM2只加密SM4的钥匙数字信封又快又安全。Q4ECB为什么还在历史遗留。新系统绝对不要用无脑选GCM。Q5SM3能存密码吗千万别直接用SM3算得太快坏人用显卡一秒能试几亿次加盐也扛不住。正确做法存密码必须用慢速哈希如bcrypt、scrypt、Argon2。如果合规要求必须用国密用SM3 大量迭代如10万次 盐或者使用专门的国密KDF算法绝不能只存一次 SM3(密码盐)。Q6GCM的IV为什么不能重复GCM的IV初始化向量必须是随机的、且每个密钥下只能用一次。如果同一把钥匙配合同一个IV加密了两次攻击者通过比较两次密文就能推算出密钥。这是一个容易被忽视但后果极其严重的坑。开发时务必用安全的随机数生成器。Q7现实中的App点餐真的用SM2签名吗实际工程中SM2签名更多出现在国密SSL/TLS握手或设备认证等底层环节。科普文为了便于理解把SM2简化成用户App签名单笔订单。实际App更常用登录后的会话令牌Token标识身份国密算法封装在底层的安全通道里。六、三条铁律SM4只用GCMECB直接拉黑SM2私钥死守谁拿到就能冒充你存密码用慢速哈希SM3必须加迭代盐现在你知道了——每次在快餐店App上点外卖订单号、快递袋、电子指纹就是国密算法的日常运转。