Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证iPhone设备ID?_Iphone_Cocoa Touch_Security - Fatal编程技术网

验证iPhone设备ID?

验证iPhone设备ID?,iphone,cocoa-touch,security,Iphone,Cocoa Touch,Security,有没有办法验证iPhone设备ID?我希望能够接受iPhone用户通过HTTP请求提交的设备Id,并验证他们是否绑定到合法设备。如果有办法验证Id,那么就有办法创建真实的假Id 我同意泰勒的意见,有一种方法可以创建id(简单)和验证id(也很简单),但创建“假”id需要扫描整个密钥空间(硬)或窃取生成密钥的私钥(TLS实际上就是这样工作的)。 我最初的一些评论是无效的 尽管如此,苹果设备Id的工作原理并非如此,因为如果您直接使用[[UIDevice currentDevice]uniqueId

有没有办法验证iPhone设备ID?我希望能够接受iPhone用户通过HTTP请求提交的设备Id,并验证他们是否绑定到合法设备。

如果有办法验证Id,那么就有办法创建真实的假Id


我同意泰勒的意见,有一种方法可以创建id(简单)和验证id(也很简单),但创建“假”id需要扫描整个密钥空间(硬)或窃取生成密钥的私钥(TLS实际上就是这样工作的)。 我最初的一些评论是无效的


尽管如此,苹果设备Id的工作原理并非如此,因为如果您直接使用
[[UIDevice currentDevice]uniqueIdentifier]获取Id,它们会根据硬件的各种Id值(例如MAC地址)生成Id
与其提示用户输入,没有理由不将其作为合法的设备ID。

要验证来自应用程序的请求,您可以发送UUID和散列,其中散列=SHA1(UUID+密钥存储在应用程序中)。然后在服务器端执行相同的哈希函数,并验证它们是否匹配。您可以将时间戳添加为nonce,在其中发送UUID、timestamp、hash,hash=SHA1(UUID+SECRET\u KEY\u存储在\u APP+timestamp中)


这当然不是防失败的,并且有很多限制,但这是否会使欺骗UUID变得更加困难

作为对Martin Gorton的回应,第三方库不能信任UIDevice uniqueIdentifier-使用Objective C方法swizzling来欺骗它是微不足道的

方法swizzling为一个类(UIDevice)交换两个选择器(uniqueIdentifier和spoofUniqueIdentifier)。swizzle之后,对UIDevice uniqueIdentifier的后续调用将返回伪造的UDID。这有助于测试没有有效UDID的UDID键控库

以下是来自以下网站的一些示例代码:

#导入
//交换类的实例方法选择器,我们这样做是为了重载类别声明中的现有方法
无效swizzleMethodsForClass(c类,SEL-origMethodSel,SEL-newMethodSel)
{
NSLog(@“swizzling%@实例方法:%@->%@),NSStringFromClass(c),
NSStringFromSelector(origMethodSel)、NSStringFromSelector(newMethodSel));
方法origMethod=class_getInstanceMethod(c,origMethodSel);
方法newMethod=class_getInstanceMethod(c,newMethodSel);
//检查方法是否从超类继承
if(class_addMethod(c,origMethodSel,method_getImplementation(newMethod),method_getTypeEncoding(newMethod)))
类_replaceMethod(c,newMethodSel,method_getImplementation(origMethod),method_getTypeEncoding(origMethod));
//exchange非子类方法
其他的
方法交换实施(原始方法,新方法);
}   
@接口设备(SpoofUDID)
@结束
#定义UDID_TO_欺骗@“E0101010D38BDE68E674011211AF315301010223”
@实现UIDevice(SpoofUDID)
//为UIDevice类swizzle此实例方法
-(NSString*)spoofUniqueIdentifier
{
静态NSString*spoofUDID=UDID\u TO\u SPOOF;
NSLog(@“欺骗%@而不是%@),欺骗ID,[[UIDevice currentDevice]
spoofUniqueIdentifier]);
返回spoofUDID;
}
@结束
//从你的应用程序代表处调用此
-(void)initUDID
{
NSString*UDID=[[UIDevice currentDevice]唯一标识符];
NSLog(@“这是我的旧udid:%@”,udid);
swizzleMethodsForClass([UIDevice class]、@selector(uniqueIdentifier)、@selector(spoofUniqueIdentifier));
NSString*UDID2=[[UIDevice currentDevice]唯一标识符];
NSLog(@“这是我的新udid:%@”,UDID2);
}

没有apple文档或规范指定此字符串的布局

只有苹果知道哪个UDID是真的,哪个是假的

一个有根据的猜测是,它们的长度为40个字符,由字母数字字符组成。(a-f0-9)

正则表达式模式:

[a-z0-9]{40}

要验证UDID,请尝试以下正则表达式([A-F0-9]{40})$ 或者你可以去

如果您使用的是
[[UIDevice currentDevice].identifierForVendor uuiString]
(您应该这样做)-那么它只是一个guid,您可以 正则表达式是(
^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12}$
) 或者你可以


希望这能为您节省一些时间。

如果有一个有效ID的中央数据库呢?可能有,但苹果永远不会让您接近它。我不知道有哪家(主要)公司让你浏览过他们的序列号。这种说法是基于对现代密码工作原理的误解。现代密码学基于这样一种思想:有些函数很容易计算,但很难求逆。例如,在公钥加密中,任何人都可以加密邮件,但只有收件人可以解密。如果所有UDID中只有一小部分是有效的,那么生成伪造的UDID将非常耗时。我认为bpapa正在试图阻止恶意用户编写的非iphone客户端访问他的服务。他可能想尝试生成某种签名,以确保消息没有被伪造。例如,请参阅Flickr的签名机制(本页第8页:)注意Flickr方法中的漏洞。详见本文件,但TL;DR将使用类似于sha1而不是md5的东西来避免潜在的伪造。我不知道有一个。你试过在Apple开发板上提问吗?我认为推送通知可能是验证UDID的一种方法,但事实并非如此:如果你可以对40个字符进行长度验证,那么如果应用程序二进制文件中存储了一个秘密,那么就可以获取并共享它。安全获取秘密的唯一方法是在初始启动时,通过SSL调用Web服务,获取密钥,并将其存储在手机的密钥链中。但是当你这么做的那一刻,其他人也可以模仿你的应用程序并获得密钥。所有的安全性都是一种成本效益权衡。T
[a-z0-9]{40}