CocoaFob 是一组用于在 Objective-C 应用程序中生成和验证注册码的辅助代码片段,它与 Potion Store (http://www.potionfactory.com/potionstore) 和 FastSpring (http://fastspring.com) 中的注册码生成集成。
当前的实现使用 DSA 来生成注册密钥,这大大降低了破解者为您的软件制作密钥生成器的可能性。不幸的是,这也意味着注册码可能会很长并且长度不固定。
为了使注册码更具可读性,CocoaFob 使用稍微修改过的 base32 进行编码,以避免产生含义模糊的字符。它还将代码分组为五字符一组,并用短划线分隔。使用 512 位 DSA 密钥生成的示例注册码如下所示:
GAWQE-FCUGU-7Z5JE-WEVRA-PSGEQ-Y25KX-9ZJQQ-GJTQC-CUAJL-ATBR9-WV887-8KAJM-QK7DT-EZHXJ-CR99C-A
DSA 的优点之一是,对于给定的注册名称,每个生成的代码都是不同的,因为在此过程中引入了一个随机元素。
名称“CocoaFob”是“Cocoa”(Mac 和 iOS 编程框架)和“Fob”(钥匙扣,用来放置钥匙的东西)的组合。
CocoaFob 为您的应用程序提供以下功能:
使用 DSA 的基于安全非对称密码术的注册密钥生成和验证。
支持在 Objective-C 和 Ruby 中生成密钥,并在 Objective-C 中进行验证,以便集成到您的 Cocoa 应用程序和 Potion Store 中。
支持自定义 URL 方案以实现自动应用程序注册。
没有需要链接的框架或库。您可以直接在应用程序项目中包含所需的文件,并且可以自由地以任何您需要的方式修改代码。
您还可能发现其他有用的代码片段,例如 base32 和 base64 编码/解码函数,以及使用 base32 和 base64 方法扩展 NSString
和 NSData
类的类别。
获取最新版本的代码的最佳方法是克隆主 Git 存储库:
git://github.com/glebd/cocoafob.git
您也可以从 CocoaFob 主页 http://github.com/glebd/cocoafob/ 下载最新版本。
有关如何使用 CocoaFob 的更完整的示例,请查看 Alex Clarke 的以下项目:CodexFab https://github.com/machinecodex/CodexFab/ 和 LicenseExample https://github.com/machinecodex/CodexFab_LicenseExample/。
要注册使用 CocoaFob 的应用程序,必须提供一个源信息字符串,该字符串可以像注册名称一样简单,或者在您的应用程序以用户友好的方式处理包含的信息时可以任意复杂。例如,如 Potion Store 许可证生成器的示例实现中建议的那样,源字符串可以包含应用程序名称、用户名和副本数量:
myapp|Joe Bloggs|1
发送注册邮件时,您需要提供源字符串和注册码。 Potion Store 会为您执行此操作。 但是,需要进行小的修改才能使自动激活工作。
Potion Store 支持通过单击注册电子邮件或“谢谢”商店页面上的特殊链接来自动激活已安装的应用程序。 为此,您需要:
使您的应用程序支持注册 URL 方案;
修改 Potion Store,以便自动激活链接不仅包含注册码,还包含注册源字符串。
Potion Store 注册码支持的库存实现假定注册代码是注册应用程序所需的全部内容。 但是,CocoaFob 需要知道注册名称和注册码才能验证许可证。 这意味着,当 Potion Store 为您的应用程序生成自动注册 URL 时,它需要在其中包含注册源字符串。 一种可能的解决方案如下:
001_create_tables.rb
中,将 line_items
表中的 license_key
列的长度增加到 128 个字符: t.column "license_key", :string, :limit => 128
app/models/line_item.rb
中,在顶部添加以下行: require "base64"`
license_url
的函数,该函数位于文件的底部附近。 将其替换为以下内容(或根据您的意愿进行修改): def license_url
licensee_name_b64 = Base64.encode64(self.order.licensee_name)
return "#{self.product.license_url_scheme}://#{licensee_name_b64}/#{self.license_key}" rescue nil
end
这将使生成的注册码包含 base64 编码的被许可人名称。 当您的应用程序通过单击注册链接打开时,它将解析代码,提取注册名称并使用它来验证许可证。
objc 目录中的以下文件提供了对应用程序注册的自定义 URL 架构支持的示例实现。 该代码几乎完全取自[3]。
要在您的应用程序中支持注册 URL,请执行以下操作:
将文件 MyApp.scriptSuite
和 MyApp.scriptTerminology
添加到您项目的资源中,并适当调整其中的字符串。
将以下内容添加到应用程序的 Info.plist
文件中的 /plist/dict
键下(用适合您公司和应用程序的字符串替换 mycompany 和 myapp):
<key>NSAppleScriptEnabled</key>
<string>YES</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>com.mycompany.myapp.lic</string>
</array>
</dict>
</array>
将文件 URLCommand.h
和 URLCommand.m
添加到您的项目中,并注意其中的 TODO:
注释。 具体来说,您可能希望将注册信息保存到您的应用程序首选项中,并在验证提供的注册 URL 后广播已更改的注册信息的通知。
确保 Info.plist
文件中的 URL 方案名称 (com.mycompany.myapp.lic
) 与 Potion Store 的数据库生成脚本中的名称相同。 它是文件 db/migrate/001_create_tables.rb
,并且该变量称为 license_url_scheme
。
通过进行测试购买(这将导致显示激活链接)并单击该链接来测试 URL 架构支持。 如果您在调试器中运行应用程序,请在类 URLCommand
的实例方法 performWithURL:
中放置一个断点。 当您单击注册链接时,将触发该断点。 您可以将该链接提取到独立的 HTML 文件中,以便在无需进行任何其他测试购买的情况下进行测试。
重要提示:包含的密钥仅用于演示和测试目的。 请勿在您的软件中使用包含的密钥。 在将 CocoaFob 合并到您的应用程序中之前,您需要生成一对自己的 DSA 密钥。 我使用了 512 位的密钥长度,我认为这足以用于生成注册码。
(0) 确保已安装 OpenSSL。 (如果您使用的是 Mac OS X,则已安装。)
(1) 生成 DSA 参数
openssl dsaparam -out dsaparam.pem 512
(2) 生成未加密的 DSA 私钥
openssl gendsa -out privkey.pem dsaparam.pem
(3) 从私钥中提取公钥
openssl dsa -in privkey.pem -pubout -out pubkey.pem
有关更多信息,请参见 [2]。
CocoaFob 根据 BSD 许可证分发 https://open-source.org.cn/licenses/bsd-license.php。 请参阅 LICENSE 文件。
[0] 不断让我惊叹的 Mac 开发者社区。
[1] Base32 实现版权所有 © 2007 Samuel Tesla,来自 Ruby base32 gem:http://rubyforge.org/projects/base32/。
[2] OpenSSL 密钥生成 HOWTO:http://www.openssl.org/docs/HOWTO/keys.txt
[3] 在 Cocoa 中处理 URL 架构:Kimbro Staken 的博客文章
[4] 为应用程序注册协议处理程序:CocoaBuilder 邮件列表中的帖子
[5] PHP 实现由 Sandro Noel 提供
[6] 基于安全框架的实现由 Matt Stevens 提供,http://codeworkshop.net
[7] 新 API 由 Danny Greg 提供,http://dannygreg.com