首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条形码校验和的安全性

条形码校验和的安全性
EN

Security用户
提问于 2017-12-27 22:00:30
回答 1查看 776关注 0票数 5

一家公司正在分发带有独特code128条形码的礼品券。条形码由12个固定字符组成,包含元信息和序列号,加上4位数字校验和。例如:

B2DS 40453072 6531

  • 前4个字符:将收到凭单的公司标识符
  • 接下来的8个字符:序列id (范围从00000001到99999999)
  • 最后4个字符:前12个字符的校验和

我想知道,如果某个人收到X张代金券(通常是连续的),这个计划是否可以被黑客攻击。很明显,在这种情况下,要找到前12个字符的含义,推导出用于计算校验和的逻辑有多难?

EN

回答 1

Security用户

发布于 2017-12-28 06:14:23

code128校验和不是密码安全的.

我想你误解了支票和的目的。校验和用于检测数据读取中的意外损坏或错误。将数据转换为校验和,并与预期的校验和进行比较。如果两者不同,您就知道读取数据时出现了错误。这样做的目的是减少阅读中的意外错误导致相同校验和的可能性。校验和算法本身是公共的,易于计算,例如使用以下函数,其中code128_table是特定的索引表 (代码A、B或C):

代码语言:javascript
复制
uint8_t code128_checksum(uint8_t *buf, uint32_t len)
{
    uint32_t sum = *buf - 32;

    while (--len)
        sum += len * code128_table[*(buf + len)];

    return sum % 103 + 32;
}

此校验和非常简单,只为在扫描过程中检测错误而设计。它是一个“真”和,意味着它只不过是每个分量字符的表示乘以一个权重因子的总和。因此,和实际上就是它所保护的数据的和。它不是为条形码提供任何类型的加密属性。按照设计的方式,以下所有这些都是可能的,以便增加计算复杂度:

  • 哈希-给定一个未加校验的条形码,计算校验和。
  • 冲突-创建两个条形码的不同内容,但相同的校验和。
  • 第二个预图像-给定一个校验求和条形码,创建另一个具有相同校验和。
  • 第一个预图像-只给一个校验和,创建一个条形码与相同的校验和。

它唯一(谦虚地)擅长的是确保条形码的随机变化不会导致相同的校验和。即使是这样,也不是特别好。具有相同摘要大小的高级校验和(尽管仍然不安全)将是CRC8,因为启联优于常规校验和用于错误检测。8位CRC的简单实现(其中crc8_table精心挑选 8位CRC多项式)如下所示:

代码语言:javascript
复制
uint8_t crc8(uint8_t *buf, uint32_t len)
{
    uint8_t crc = ~0;

    while (len--)
        crc = crc8_table[crc ^ *buf++];

    return crc;
}

无论您使用的是简单校验和( CRC )还是显着地更复杂和更慢的密码安全散列函数,如果键空间仅为8个十进制字符,而序列ID中的所有8个字符对公司ID B2DS都有效,则可以创建所有99,999,998可能的条形码,并与相关校验和匹配。一个完全未优化的实现在我自己的计算机上花费了19秒钟。键空间太小了,即使有加密安全的散列。

正如@Philipp在评论中提到的那样,一个更好的解决方案是分发带有随机ID的条形码。允许每个ID被使用有限的次数,并监视试图使用没有明确颁发的ID的条形码。如果这样做了,那么即使在任何时候都有一千个有效的条形码,随机条形码也只有十分之一的机会有效,这就使得欺骗性地使用这些代码变得困难得多。

票数 10
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/176218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档