我遇到过以某种方式与存储介质绑定的许可证系统。虽然基于文件系统上的 UUID 来判断这一点相当简单,但我不认为这是事实(见下文)。这种行为的一个典型示例如下:
- 每次启动时,都会生成一个 id 文件。
- 系统将检查密钥文件以获取许可证。如果密钥与 ID 匹配,则一切正常。
- 如果没有密钥,或者密钥与 ID 不匹配(例如,从不同系统复制),则许可证无效。
我观察到以下行为:
- 彻底擦除 CF 卡并重新安装将导致生成相同的 id 文件,因此不需要新的密钥文件。
- 在不同的 CF 上使用相同的密钥不起作用,因为它与新 id 文件的内容不匹配。
这让我得出结论,有一种方法可以以某种方式获取 CF 卡的唯一 ID。如何在 Linux 中实现这一点?
附言:我故意省略了产品本身的任何细节,因为我更想知道像这样的系统如何构建 CF 卡的唯一 ID。
答案1
该卡将以只读方式登记大量信息。
文章读取内部 SD 卡信息有话要说:
内部 SD 卡信息
SD 卡的信息被编码在其内部卡注册表中。其中之一是卡识别 (CID)寄存器,一个 16 字节代码,包含唯一标识 SD 卡的信息,包括卡序列号 (PSN)、制造商 ID 号 (MID) 和制造日期 (MDT)。CID 寄存器在制造卡时设置,设置后无法更改。(根据 SD 卡规范,信息只能写入一次,但如果卡不符合规范,则此信息可能会更改!)
如何从 SD 卡读取 CID
读取 CID 的一种方法是使用带有 SD 卡插槽的笔记本电脑。笔记本电脑中的读卡器通常直接通过 PCI 总线(或 IDE 总线)连接。这无法通过 USB 读卡器进行,因为检索卡信息的命令会被拦截,读卡器无法理解。并非所有带有内置卡插槽的计算机都可以使用,一些内部读卡器通过 USB 总线连接。
假设您有合适的硬件,您可以使用多种方法来获取卡信息。使用 Linux,读取内部 SD 卡信息很简单。插入卡并查看
/sys/block/mmcblk0/device/
(此位置可能因您的设备而异)。您将看到几个可用的属性,包括 CID 寄存器及其内部的信息。
答案2
正如其他人所评论的那样,这可能与 CF 卡被擦除的方式有关,但更可能的是,软件根据卡中的固件识别 CF 卡 -
通常可以使用“udevinfo”读取此信息 - 例如,如果 CF 卡是 /dev/sdb udevinfo -a -p $(udevinfo -q path -n /dev/sdb) - 这很可能包含足够的信息来唯一地标识该卡。
笔记: 在基于 Debian 的发行版上udevadm info
替换udevinfo
:
udevadm info -a -p $( udevadm info -q path -n /dev/sdb )