测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2015年6月 |
由Shaps 维护。
依赖 | |
SPXDefines | >= 0 |
SPXDataValidators | >= 0 |
SPXKeychain | >= 0 |
(2015年2月21日星期天)
Abracadabra 是为我的一个个人项目设计的。一个名为 Drizzle 的应用程序。Drizzle 是一个用于在 Digital Ocean 上管理服务器实例的应用程序。您可以想象这类似于需要紧密控制用户操作以避免意外关闭或更严重情况的应用程序。不用说第三方恶意行为。
这是一个现有的项目,所以我不想修改大量现有的代码,可能会引入更多问题并降低稳定性。
所以我着手设计了一个真正即插即用的解决方案,使得封装我的代码并获得密码安全的好处变得超级简单。
这不仅仅是 PIN 输入用户界面。事实上,这个库的这部分是完全可选的,为了您的方便。Abracadabra 处理您所有的安全需求。
如果您将整个库包含在您的项目中,您甚至可以得到可选的 UI 元素。实际上,您甚至不需要编写任何代码就可以开始。只需包含 POD,它就会默认使用 ;)
介绍 Abracadabra!
这个名字指的是其实施的神奇性质,以及需要密码(或神奇短语)的事实 ;)
以下功能在核心中可用,并且可完全配置。
以下所有内容均按保险库划分。
请参阅示例项目,了解如何全面使用所有这些功能。
要运行示例项目,首先从示例目录克隆存储库,然后运行pod install
。
要在自己的项目中使用Abracadabra,将#import "Abracadabra.h"
添加到文件中,并将代码包装在安全块中。
假设你有一些这样的代码
NSURLSession *session = [NSURLSession sharedSession];
NSURL *URL = [NSURL URLWithString:@"http://api.server.com/server?id=23213&action=restart"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
现在我们可以通过将Abracadabra包装起来轻松地安全地保护这段代码。魔法!
Abracadabra(SPXSecurePolicyAlwaysWithPIN, {
NSURLSession *session = [NSURLSession sharedSession];
NSURL *URL = [NSURL URLWithString:@"http://api.server.com/server?id=23213&action=restart"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
})
如果你对默认的视图控制器和功能感到满意,就是这样;)你甚至不需要配置选项、提供视图,什么都不用做!只需放松,享受魔法。
建议你始终提供一组和名称,即使你不打算在应用中实现viewController,因为这也用于提供更好的文本反馈、确认对话框等...
你可能也会注意到在单行条目中分号和大括号都是可选的(在成功和失败块中都是如此)。Abracadabra会为你处理这些,让你的代码更加干净;)
欢迎使用;)
然而,有时你想要为用户提供一个简洁的用户界面,让他们能够控制应用于单个操作的策略。
这也很简单,只需在你的安全代码块中添加一个组和事件名称,Abracadabra会为你处理其余的。
Abracadabra(@"Servers", @"Restart Server", SPXSecurePolicyAlwaysWithPIN, {
NSURLSession *session = [NSURLSession sharedSession];
NSURL *URL = [NSURL URLWithString:@"http://api.server.com/server?id=23213&action=restart"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
})
实际上,以下任何一种变体都是有效的语句
Abracadabra(SPXSecurePolicyNone, {
/* this code will execute if access is allowed */
});
Abracadabra(@"", @"", SPXSecurePolicyNone, {
/* this code will execute if access is allowed */
});
Abracadabra(SPXSecurityPolicyNone, {
/* this code will execute if access is allowed */
}, { \
/* this code will execute if access is disallowed */ \
});
Abracadabra(@"", @"", SPXSecurePolicyNone, {
/* this code will execute if access is allowed */ \
}, { \
/* this code will execute if access is disallowed */ \
});
注意那些第二个块?这允许你根据成功或失败来控制流程。在这种情况下,-performSecureCode
只有在策略认证通过的情况下才会执行。否则将执行返回语句,日志语句将不会显示。
Abracadabra(SPXSecurePolicyAlwaysWithPIN, {
[self performSecureCode]; \
}, return)
NSLog(@"Authentication Failed.");
通过在返回周围使用可选括号,我们现在可以将日志语句也放在失败块中。
Abracadabra(SPXSecurePolicyAlwaysWithPIN, {
[self performSecureCode]; \
}, {
NSLog(@"Authentication Failed.");
return; // in this case no more code exists at this scope, so this is no longer required
})
在内部,该库负责将您密码保存到密钥链、比较条目、跟踪重试、呈现密码输入等...
然而,Abracadabra 的一个关键功能在于它能够发现代码中的所有安全事件,并以优美的视图展示这些事件,使用户能够在运行时修改每个事件所应用的政策。事实上,Abracadabra 甚至会自动跨会话持久化这些信息 ;)
那么它是如何工作的呢?
这部分代码实际上是基于我从 FBTweaks 得到的想法。Facebook 展示了一个很好的实现,其中你可以在编译时将一些数据存储在二进制文件中。
Abracadabra 使用 Mach-O 运行时来查找这些数据,并自动构建一个事件存储库。视图控制器可以直接查询此存储库以展示用于配置其政策的用户界面。
每个事件的政策随后存储在 NSUserDefaults
中,这使得我们能够在应用启动间持久化更改。
当你创建一个安全事件时,你必须指定应用到该段代码的默认政策。你还可以在任何时候将事件(或所有事件)重置为其默认值,因为该值在编译时存储,并在运行时只读。
如果你愿意,可以替换所有视图和控制器为自己的实现。
内部,Abracadabra 是异步的,这样我们就不会阻塞主线程。然而,你包装的所有代码都保证会在这个调用的线程上执行。所以,你的期望不会改变。但是由于它是异步的,你需要小心处理执行顺序。建议你在当前作用域内包装一切。
许多应用或第三方库都存在基于密码的集成形式。然而,其中大多数都使用内置的(通常是 incompletely)实现。
在应用中提供密码并不仅仅是在视图中显示 PIN 输入表单。这只会给你的用户一种虚假的安全感。
此外,许多开源实现依赖于实现者执行不必要的检查,包括 Apple 的 TouchID 高级解决方案。
Abracadabra 被设计用来从你的项目中移除几乎所有的“安全”代码。这使得你能够专注于你的特征,构建应用逻辑,将安全作为次要考虑。
注意,我并不赞成不“考虑”安全的想法!然而,如果你不想这么做,至少使用 Abracadabra 来让生活更轻松,让你的代码更安全。
我所做的设计选择是为了使你更容易地将它们实施到代码中,提高你花费时间保护应用程序的概率。
使用 Abracadabra 的一个很好的原因是因为我的解决方案是如此优雅和轻量级,使得你实际上可以在不更新您的应用程序代码的情况下,很容易地改进安全库本身!
Abracadabra 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile
包括所有组件: pod 'Abracadabra'
只包含核心(无 UI 组件) pod 'Abracadabra/Core'
Shaps Mohsenin,@shaps
Abracadabra 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。