Abracadabra 1.3.2

Abracadabra 1.3.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年6月

Shaps 维护。



 
依赖
SPXDefines>= 0
SPXDataValidators>= 0
SPXKeychain>= 0
 

  • 作者
  • Shaps Mohsenin

更新

(2015年2月21日星期天)

  • 设置控制器尚未实现 -- 进行中
  • Abracadabra 目前以当前方向启动,但尚不支持在显示时改变方向 -- 已完成
  • 事件控制器尚未实现 -- 已完成
  • 当您提供组/名称时,此条目将在启动之间持久化,策略为默认值。因此,如果跨运行更改策略或允许运行时配置,则该值可能与代码中显示的不同。此功能尚不正确 -- 已完成
  • TouchID 尚未实现 -- 已完成

它是什么?

Abracadabra 是为我的一个个人项目设计的。一个名为 Drizzle 的应用程序。Drizzle 是一个用于在 Digital Ocean 上管理服务器实例的应用程序。您可以想象这类似于需要紧密控制用户操作以避免意外关闭或更严重情况的应用程序。不用说第三方恶意行为。

这是一个现有的项目,所以我不想修改大量现有的代码,可能会引入更多问题并降低稳定性。

所以我着手设计了一个真正即插即用的解决方案,使得封装我的代码并获得密码安全的好处变得超级简单。

这不仅仅是 PIN 输入用户界面。事实上,这个库的这部分是完全可选的,为了您的方便。Abracadabra 处理您所有的安全需求。

  • 使用单个便利宏(带多个选项)轻松保护您的代码
  • 轻松找到您代码中的所有 Abracadabra 引用,并在运行时显示它们供用户配置
  • 支持 iPhone 和 iPad 的布局,包括旋转

如果您将整个库包含在您的项目中,您甚至可以得到可选的 UI 元素。实际上,您甚至不需要编写任何代码就可以开始。只需包含 POD,它就会默认使用 ;)

介绍 Abracadabra!

这个名字指的是其实施的神奇性质,以及需要密码(或神奇短语)的事实 ;)

完整功能列表

核心

以下功能在核心中可用,并且可完全配置。

  • 简单通过便利宏进行代码封装
  • 密码管理 & 配置
    • 最大密码尝试次数
    • 基于时间的会话的默认超时间隔
    • 当没有注册视图控制器或尚未定义密码时,自动回退到警报确认
    • 达到最大重试次数后自动锁定
    • 在iPhone上使用警报对话框 — iPad始终使用警报
  • 全面支持iPhone、iPad和方向
  • 支持Touch ID
  • 可以注册自己的视图控制器用于密码、事件和设置(如果您包含用户界面子规范,这些控制器将默认提供)
  • 支持多个保险库 — 如果您想将保险库分配给用户帐户,这很有用
  • Abracadabra会自动找到所有的宏定义 — 包括您包装代码的位置 — 因此您可以在任何时候访问列表以进行运行时配置
  • 监听认证失败和保险库锁定通知的保险库代理和通知 — 对于注销用户等很有用...
  • 会话管理 — 包括一次性会话和定时会话
  • 所有凭证/密码的加密散列(SHA2),包括在密钥链中的进入和存储
  • 事件持续的策略更新 — 包括跨启动

用户界面

以下所有内容均按保险库划分。

  • 可以呈现给用户用于在运行时配置策略的安全的视图控制器
  • 设置视图控制器用于配置你的保险库
  • 在认证失败时设备震动
  • 自定义字段和按钮以提示密码、Touch ID和确认
  • 使用带有光效果的模糊效果呈现视图控制器

请参阅示例项目,了解如何全面使用所有这些功能。

用法

要运行示例项目,首先从示例目录克隆存储库,然后运行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 是异步的,这样我们就不会阻塞主线程。然而,你包装的所有代码都保证会在这个调用的线程上执行。所以,你的期望不会改变。但是由于它是异步的,你需要小心处理执行顺序。建议你在当前作用域内包装一切。

为什么我应该使用 Abracadabra?

许多应用或第三方库都存在基于密码的集成形式。然而,其中大多数都使用内置的(通常是 incompletely)实现。

在应用中提供密码并不仅仅是在视图中显示 PIN 输入表单。这只会给你的用户一种虚假的安全感。

此外,许多开源实现依赖于实现者执行不必要的检查,包括 Apple 的 TouchID 高级解决方案。

Abracadabra 被设计用来从你的项目中移除几乎所有的“安全”代码。这使得你能够专注于你的特征,构建应用逻辑,将安全作为次要考虑。

注意,我并不赞成不“考虑”安全的想法!然而,如果你不想这么做,至少使用 Abracadabra 来让生活更轻松,让你的代码更安全。

我所做的设计选择是为了使你更容易地将它们实施到代码中,提高你花费时间保护应用程序的概率。

使用 Abracadabra 的一个很好的原因是因为我的解决方案是如此优雅和轻量级,使得你实际上可以在不更新您的应用程序代码的情况下,很容易地改进安全库本身!

安装

Abracadabra 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile

包括所有组件: pod 'Abracadabra'

只包含核心(无 UI 组件) pod 'Abracadabra/Core'

作者

Shaps Mohsenin,@shaps

许可协议

Abracadabra 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。