1.这是一个root级别的mac app。
2.需要操作其他普通用户的default keychain。
3.需要跳过授权过程,直接操作。
我用了以下的方法:
SecKeychainOpen
SecKeychainItemCreateFromContent
SecKeychainFindGenericPassword
SecKeychainItemDelete
现在的问题就是:
怎么能做到不需要授权就能操作其他普通用户的default keychain?
1.这是一个root级别的mac app。
2.需要操作其他普通用户的default keychain。
3.需要跳过授权过程,直接操作。
我用了以下的方法:
SecKeychainOpen
SecKeychainItemCreateFromContent
SecKeychainFindGenericPassword
SecKeychainItemDelete
现在的问题就是:
怎么能做到不需要授权就能操作其他普通用户的default keychain?
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
要实现这个功能,你需要使用Objective-C的CFPreferencesCopyString
和CFPreferencesSetString
方法来读取和设置默认密码。但是请注意,这可能会违反安全标准,因为这些方法允许你访问用户账户的信息。
以下是一个示例代码:
NSString *defaultKeychainPath = @"/Library/Preferences/com.apple.keychain";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *keychainName = @"com.example.appname";
NSString *password = @"your_password_here";
[NSKeyedArchiver archivedDataWithRootObject:keychainName];
NSData *data = [NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithBytes:nil length:0]];
// 寻找并打开默认的Keychain文件
SecItemRef itemRef = SecKeychainItemCreateFromContent(data, nil);
if (itemRef) {
// 获取键值对列表
NSArray *items = SecItemCopyItems(itemRef);
for (int i = 0; i < items.count; ++i) {
SecItemRef item = items[i].ref;
if ([items[i].string isEqual:keychainName]) {
// 设置新密码
SecItemSetValue(item, password, sizeof(password), kSecAttrValue);
SecItemRelease(item);
break;
}
}
// 保存更改
SecItemRelease(itemRef);
}
// 关闭Keychain服务
SecItemRelease(itemRef);
这段代码首先获取到默认Keychain路径,然后尝试查找指定名称的Keychain文件。如果找到了,它会创建一个新的密钥,并将其与指定的密码关联起来。最后,它会关闭Keychain服务。
注意:这段代码可能无法在所有环境中工作,因为它涉及到敏感信息的处理,例如密钥、密码等。如果你需要在生产环境中使用此代码,请确保遵循相关法律法规和公司政策。