CoreML模型加密密钥自动生成与上传方法咨询
背景
我已创建TensorFlow模型,并通过Apple的coremltools Python包转换为CoreML模型用于iOS应用,当前工作流程如下:
- 通过脚本生成模型并转换为CoreML格式
- 手动打开生成的模型,通过UI生成加密密钥
- 通过脚本将生成的密钥添加至Xcode
- 构建应用时,Xcode通过编译器标志
--encrypt "$SRCROOT/App/Resources/Models/MyModel.mlmodelkey"自动加密模型
自动化加密需求
每次应用发布都需要修改优化模型,希望实现加密密钥的自动生成并添加至Xcode。已知可通过终端命令xcrun coremlcompiler compile <model.{mlmodel,mlpackage}> </desired/path/to/output/directory> --encrypt <path/to/model_key_file>加密CoreML模型,但xcrun coremlcompiler --help中找不到自动生成密钥的方法,目前只能依赖UI操作。
请问能否通过命令行或其他自动化方式生成CoreML模型的加密密钥?
密钥上传至Apple服务器需求
理想情况下,我希望在模型进入Xcode前,通过终端用生成的密钥完成加密,这可通过--encrypt参数实现:
xcrun coremlcompiler compile <model.{mlmodel,mlpackage}> </desired/path/to/output/directory> --encrypt <path/to/model_key_file>
由于加密密钥会从Apple服务器下载至用户设备,当向Xcode提供预加密模型(如作为框架的一部分)时,能否将该密钥上传至Apple服务器?
解答
1. 命令行自动生成CoreML加密密钥
可以通过security命令行工具生成符合CoreML要求的AES-256密钥,步骤如下:
- 生成256位(32字节)的随机密钥并保存到文件:
security generate-random 32 > MyModel.mlmodelkey
该密钥文件与Xcode UI生成的格式完全兼容,后续可直接用于coremlcompiler的--encrypt参数,或添加到Xcode项目中实现自动加密。
2. 预加密模型的密钥上传至Apple服务器
使用预加密CoreML模型时,必须将对应密钥上传至Apple服务器,否则用户设备无法获取密钥解密模型。具体操作:
- 将预加密模型和对应的
.mlmodelkey文件添加到Xcode项目中 - 在Xcode的Build Settings中,确保
CoreML Model Compiler Flags包含--encrypt "$SRCROOT/你的密钥文件路径/MyModel.mlmodelkey" - 提交应用到App Store Connect时,Xcode会自动将密钥上传至Apple服务器;若使用
xcodebuild命令行打包,只要配置好对应编译参数,打包过程也会自动完成密钥上传。
注意:预加密模型的密钥必须与加密时使用的完全一致,否则会导致模型无法在用户设备上加载。
内容的提问来源于stack exchange,提问作者Meanman

