验证 iPhone 设备 Ids?

10

有没有一种方法可以验证iPhone设备ID? 我想要能够通过HTTP请求接受iPhone用户提交的设备ID并验证它们是否绑定到合法设备。

有没有一种方式可以验证 iPhone 设备 ID?我想通过 HTTP 请求接收 iPhone 用户提交的设备 ID,并验证其是否绑定到合法设备。

1
我不知道有没有。你试过在苹果开发者论坛上问吗? - Rog
我曾认为推送通知可能是验证UDID的一种方式,但事实并非如此:https://devforums.apple.com/message/50658#50658 - bbrown
据我所知,您可以对40个字符进行长度验证。 - Durai Amuthan.H
6个回答

7
如果有一种验证ID的方法,那就有一种创造真正假ID的方法。我同意泰勒的评论,创建ID(容易)和验证它们(同样容易)的方法是存在的,但要创建一个“假”ID将需要扫描整个密钥空间(难度很大),或者窃取生成密钥的私钥(这实际上就是TLS的工作原理)。因此,我的初始评论无效了。
然而,这不是苹果设备ID的工作方式,据我所知,它们从硬件的各种值(例如MAC地址)中生成ID。

2
如果有一个有效 ID 的中央数据库会怎样呢? - Rog
2
可能有,但苹果绝不会让你接近它。我不知道是否有任何(大型)公司曾经允许您浏览其序列号。 - Shay Erlichmen
1
这个声明基于对现代加密工作方式的误解。现代加密是基于易于计算但难以反演的函数的概念。例如,在公钥加密中,任何人都可以加密一条消息,但只有接收者可以解密它。如果只有很小一部分的UDID是有效的,那么制造假的UDID将是耗时的事情。 - Tyler

6
为了验证请求来自您的应用程序,您可以发送UUID和哈希值,其中哈希值= SHA1(UUID + SECRET_KEY_STORED_IN_APP)。然后在服务器端执行相同的哈希函数并验证它们是否匹配。您可以添加一个时间戳作为一次性密码,在这种情况下,您将发送UUID、时间戳和哈希值,其中哈希值= SHA1(UUID + SECRET_KEY_STORED_IN_APP + TIMESTAMP)。
这当然不是完美的,有许多限制,但它确实使伪造UUID变得更加困难。

如果应用程序二进制文件中存储有秘密信息,那么这些信息将被获取并分享。而要安全地获取秘密信息,唯一的方法是在初始启动时通过 SSL 调用 Web 服务获取密钥,并将其存储在手机的 Keychain 中。但一旦这样做,其他人就可以模仿你的应用程序并获取该密钥。 - bbrown
所有的安全都是成本效益权衡。这比明文更好,而明文又比没有更好。 - Rog
服务器端函数不应该是使用密钥,而是SHA1(UUID + HASH + TIMESTAMP),那么服务器怎么能得到密钥呢?@baalexander - Emil

2

针对Martin Gorton的问题,第三方库不能信任UIDevice uniqueIdentifier- 使用Objective C方法交换很容易欺骗它。

方法交换可以交换一个类(UIDevice)的两个选择器(uniqueIdentifier和spoofUniqueIdentifier)。交换后,调用UIDevice uniqueIdentifier的后续调用将返回欺骗的UDID。这对于测试没有有效UDID的UDID键入库可能会有所帮助。

以下是来自http://marccodes.posterous.com/method-swizzling-uidevice-to-spoof-udid的一些示例代码:

#import <objc/runtime.h>

// swap a class's instance method selectors, we do this to overload existing methods in category declarations
void swizzleMethodsForClass(Class c, SEL origMethodSel, SEL newMethodSel)
    {
    NSLog(@"swizzling %@ instance methods: %@ -> %@", NSStringFromClass(c), 
        NSStringFromSelector(origMethodSel), NSStringFromSelector(newMethodSel));

    Method origMethod = class_getInstanceMethod(c, origMethodSel);
    Method newMethod = class_getInstanceMethod(c, newMethodSel);

    // check if method is inherited from superclass
    if(class_addMethod(c, origMethodSel, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, newMethodSel, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));

    // exchange un-subclassed method
    else
        method_exchangeImplementations(origMethod, newMethod);
    }   

@interface UIDevice (SpoofUDID)

@end

#define UDID_TO_SPOOF        @"e0101010d38bde8e6740011211af315301010223"

@implementation UIDevice (SpoofUDID)

// swizzle this instance method for UIDevice class
- (NSString *) spoofUniqueIdentifier
        {
        static NSString *spoofUDID = UDID_TO_SPOOF;
        NSLog(@"spoofing %@ instead of %@", spoofUDID, [[UIDevice currentDevice]
spoofUniqueIdentifier]);
        return spoofUDID;
        }

@end

// call this from your app delegate
- (void) initUDID
        {
        NSString *UDID = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"this is my old udid: %@", UDID);

        swizzleMethodsForClass([UIDevice class], @selector(uniqueIdentifier), @selector(spoofUniqueIdentifier));

        NSString *UDID2 = [[UIDevice currentDevice] uniqueIdentifier];
        NSLog(@"this is my new udid: %@", UDID2);
        }

0

目前为止,没有苹果文档或规范指定此字符串的布局。

只有苹果知道哪些 UDID 是真实的,哪些是虚假的。

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

正则表达式模式:

[a-z0-9]{40}

-1

要验证UDID,请尝试以下正则表达式^([A-F0-9]{40})$或者您可以在这里粘贴

如果您正在使用[[UIDevice currentDevice].identifierForVendor UUIDString](您应该这样做) - 那么它只是一个GUID,请看一下这个 正则表达式是(^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$) 或者您可以在这里粘贴

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


-1

如果您直接使用[[UIDevice currentDevice] uniqueIdentifier]来获取设备ID,而不是提示用户输入,则没有理由认为它不是合法的设备ID。


3
我认为bpapa试图阻止由敌对用户编写的非iPhone客户端访问他的服务。 - Rog
1
他可能想尝试生成某种签名来确保消息没有被伪造。例如,可以查看Flickr的签名机制(请参见此页面上的#8:http://flickr.com/services/api/auth.spec.html)。 - Martin Gordon
注意Flickr方法中的漏洞。有关详细信息,请参阅此论文,但TL;DR是使用类似于sha1而不是md5的东西以避免潜在的伪造。http://netifera.com/research/flickr_api_signature_forgery.pdf - Richard Marr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接