2010-03-18 2 views
18

Giả sử tôi có giải pháp liên quan đến ứng dụng iPhone tạo ra một số thông tin và sau đó gửi thông tin đó đến dịch vụ web để xử lý. Điều quan trọng là yêu cầu ONLY từ các trường hợp của ứng dụng iPhone cụ thể này được phép xử lý (có thể có nhiều trường hợp ứng dụng được nhiều người dùng sử dụng, nhưng tôi muốn chắc chắn rằng tất cả chúng đều sử dụng mã mà tôi tin tưởng). Nói cách khác, tôi muốn chắc chắn rằng ứng dụng iPhone của tôi không thể được (dễ dàng) mạo danh bởi các khách hàng khác. Bạn sẽ làm điều này như thế nào?Làm cách nào một máy chủ có thể xác thực ứng dụng iPhone (mã, chứ không phải người dùng)?

+0

Vui lòng ghi rõ hơn về loại bảo mật bạn có trong đầu. Bạn có muốn ức chế các yêu cầu từ các thiết bị khác (iPhone), các ứng dụng khác (trên cùng một thiết bị) hay bất kỳ yêu cầu nào từ các thiết bị tùy ý hay không. –

+0

Điểm tốt, tôi đã thay đổi câu hỏi để phản ánh điều này. Cảm ơn. –

Trả lời

3

Tất cả các câu trả lời khác cung cấp các cách hợp pháp để cung cấp thêm một số bảo mật bổ sung nhưng không hoàn hảo. Bạn nên biết trước (vì không ai khác rõ ràng) rằng không thể để cung cấp các thông tin về mặt lý thuyết an toàn sao cho máy chủ của bạn luôn có thể xác thực rằng ứng dụng ở đầu kia là bản sao ứng dụng đang chạy của bạn phần cứng bị xử phạt. Bạn không thể làm điều này bởi vì bất kỳ bảo mật cấp độ phần cứng nào Apple đã xây dựng để khởi động một chuỗi tin cậy (để điều này có thể thực sự có thể cho họ), họ không tiếp xúc với bạn.

Chiến lược của bạn do đó phải là một trong nhiều "rào cản", một số lớn hơn, một số nhỏ hơn, được thiết kế để ngăn chặn mức độ phức tạp của tấn công và sự tinh tế của kẻ tấn công. Xem các câu trả lời khác cho câu hỏi này cho một số ý tưởng hay. Có bao nhiêu rào cản bạn cần, và của sự tinh tế, phụ thuộc hoàn toàn vào chi phí cho bạn (kinh tế, tin tưởng, bất cứ điều gì) của việc có một cuộc tấn công thành công.

Cũng nên xem xét ý tưởng rằng nếu bạn có thể tránh được cuộc tấn công bảo mật "có thể tái sản xuất", bạn sẽ tốt hơn. Nói cách khác, nếu ai đó phá vỡ ứng dụng/giao thức của bạn và dữ liệu cho những người khác làm điều đó giống nhau cho mỗi bản sao/bản sao thì bạn gặp nhiều rắc rối hơn, vì các hướng dẫn/khóa có thể được đăng lên web một vài nơi. Nếu bạn có thể tìm ra cách để làm cho mọi bản sao/khách hàng trở nên độc đáo, thì bạn có thể quan sát trên máy chủ và ở mức tồi tệ nhất, cắt các máy khách bị hỏng, v.v. (Điều này thật khó trên nền tảng iPhone.)

1

Bạn có thể ẩn khóa cá nhân trong ứng dụng của mình được sử dụng cho số challenge-response authentication.

Nếu câu trả lời này quá ngắn/trừu tượng, hãy để lại nhận xét và tôi sẽ giải thích chi tiết hơn.

Edit:

tôi muốn thêm rằng tôi không nghĩ rằng có một an toàn (như trong reverse-engeneering-safe) cách để làm việc chứng thực được mô tả. Nhưng trong những điều bảo mật, tôi thấy mình thường xuyên sai lầm hơn bao giờ hết.

+2

Điều này vẫn còn khá không an toàn. Không khó để mở một tệp .ipa và rút ra tài nguyên –

+0

Đó cũng là suy nghĩ đầu tiên của tôi: có máy chủ cho khách hàng biết số X, mà khách hàng phải băm vào số thứ hai Y bằng cách sử dụng thuật toán chỉ được biết cho khách hàng và máy chủ. Nhưng vì ứng dụng sẽ có sẵn công khai, bất kỳ ai cũng có thể kiểm tra mã máy khách và đảo ngược thuật toán ... (mặc dù, đối với ứng dụng của tôi, "bảo mật thông qua tối nghĩa" có thể là đủ bởi vì nó có thể không đáng để bạn đi thông qua nỗ lực cố gắng đảo ngược kỹ thuật mã - Tôi chủ yếu cố gắng ngăn chặn giả mạo tầm thường - nhưng tôi tò mò nếu có cách tiếp cận mạnh mẽ hơn) –

+0

Tôi đồng ý rằng phương pháp này không an toàn và đặc biệt dễ bị tấn công khi truy cập ứng dụng khách . Nhưng tôi cũng nghĩ rằng không có cách nào tạo ra xác thực an toàn thực sự cho vấn đề cụ thể này. Theo tôi, giấu chìa khóa là chìa khóa tốt nhất có thể làm. –

0

Sử dụng Id thiết bị của bạn ... Gửi Id thiết bị với yêu cầu ... mỗi iphone sẽ có duy nhất Device ID

+2

UDID không phải là một bí mật rất an toàn cho các mục đích xác thực. Nó rất tốt để nhận dạng, nhưng không phải để bảo mật. –

+0

có tôi biết nhưng nó được đề cập trong câu hỏi rằng "yêu cầu ONLY từ ứng dụng iPhone đặc biệt này được phép được xử lý" ... trong trường hợp này UDID sẽ phục vụ mục đích ... –

+0

Xin lỗi, câu hỏi của tôi không rõ ràng rằng - Tôi hy vọng ứng dụng sẽ được nhiều người dùng sử dụng trên nhiều thiết bị (iPhone). Tôi không muốn hạn chế dịch vụ được sử dụng bởi một thiết bị duy nhất. Tôi đã làm rõ câu hỏi. –

1

Bất kỳ thông tin liên lạc đi tạo bởi ứng dụng của bạn có thể bị chặn và tái hiện lại sau đó. Nếu bạn muốn chắc chắn rằng một yêu cầu đến từ ứng dụng của bạn, bạn có thể làm những việc như nhúng các khóa công cộng (không phải riêng tư) trong ứng dụng của bạn và sử dụng nó để ký thông tin liên lạc của bạn. Tuy nhiên, trong tình huống như vậy, khóa riêng và khóa công khai không làm bất kỳ điều gì ngoại trừ việc không loại bỏ (ví dụ: chứng minh rằng chỉ người nhận dự định mới có thể đọc thư, vì họ là người duy nhất có nửa khớp của cặp khóa).

Điều bạn đang tìm kiếm là cung cấp tính xác thực. Bạn có thể làm điều gì đó như thực hiện trao đổi khóa DH (http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange) để tạo bí mật được chia sẻ (do mã hóa bí mật trong ứng dụng của bạn không đảm bảo bí mật), sau đó sử dụng bí mật đó để thực hiện thao tác cụ thể trên thư của bạn (mặc dù điều này vẫn không phải là tính xác thực hoàn hảo).

Hoặc bạn có thể làm điều gì đó như kiểm tra chữ ký mã của ứng dụng và xác minh rằng đó là chữ ký thích hợp và đó là ứng dụng của bạn hoặc một thứ gì đó tương tự.

Có lẽ Graham Lee sẽ bật lên và đưa ra câu trả lời tốt hơn. :)

EDIT

(suy nghĩ thành lời) Dưới đây là một ý tưởng: Sau khi ứng dụng của bạn trên các cửa hàng, bạn có thể trích xuất chữ ký mã của ứng dụng xuất bản, đặt trên máy chủ của bạn, và sử dụng trong một thách thức-phản ứng. Khi khách hàng của bạn kết nối với máy chủ, máy chủ của bạn có thể tạo ra một giá trị ngẫu nhiên và gửi lại. Máy khách có thể điều khiển giá trị đó bằng cách sử dụng chữ ký mã dựng sẵn của ứng dụng và trả về giá trị thao tác. Trong khi đó, máy chủ của bạn có thể làm điều tương tự. Khi máy chủ nhận được giá trị thao tác, nó có thể so sánh nó với phiên bản của nó và sau đó chấm dứt/tiếp tục kết nối dựa trên việc chúng có khớp hay không. Về mặt kỹ thuật, điều này vẫn có thể bị giả mạo (một ứng dụng khác có thể ăn cắp mã chữ ký và sử dụng nó), nhưng có vẻ như nó sẽ an toàn hơn.

+2

Tôi không nghĩ rằng bất kỳ đề xuất nào của bạn an toàn hơn đề xuất trong câu trả lời của tôi. Mà, thừa nhận là không an toàn, quá. –

+0

Là UDID, chữ ký mã là một lựa chọn tồi cho một bí mật, vì nó là một bí mật nổi tiếng. –

+0

@Nikolai đúng, đó là lý do tại sao tôi bắt đầu bằng "(suy nghĩ to)". :) –

1

Tôi hỏi một câu hỏi tương tự một khi trở lại:

Restricting access to server to iPhone app

Những gì tôi đã kết thúc làm là sử dụng một tên người dùng ngẫu nhiên tạo ra (GUID).Sau đó tôi lấy tên người dùng, thêm một bí mật (mã hóa cứng trong ứng dụng của tôi, được nhân đôi trên máy chủ), và SHA1 kết quả, và gửi mật khẩu đó làm mật khẩu.

Trên máy chủ, tôi lấy tên người dùng được cung cấp, nối thêm cùng một bí mật, băm và so sánh nó với những gì khách hàng đã gửi. Lưu ý rằng điều này cần phải được gửi qua SSL để thậm chí là an toàn từ xa.

Một cách tiếp cận khác là gửi chứng chỉ ứng dụng khách SSL với gói ứng dụng của bạn và định cấu hình máy chủ của bạn để chỉ chấp nhận các kết nối từ khách hàng có chứng chỉ đó.

Điểm yếu của cả hai trường hợp này là nếu ứng dụng của bạn bị bẻ khóa, sẽ không đáng kể khi trích xuất bí mật hoặc chứng chỉ ứng dụng khách.

Nếu mối quan tâm của bạn là không trả tiền cho khách hàng sử dụng tài nguyên máy chủ của bạn, bạn có một vấn đề hoàn toàn khác, bởi vì sau đó mô hình mối đe dọa chính của bạn là bản sao khởi động của ứng dụng đang chạy trên điện thoại đã được bẻ khóa. Xem câu trả lời cho câu hỏi của tôi cho một số biện pháp đối phó.

+0

Bí mật có thể dễ dàng được thiết kế ngược và sử dụng bởi người khác và chứng chỉ SSL của bạn cũng có thể dễ dàng được trích xuất. –

+0

Nếu bằng "đảo ngược thiết kế", bạn có nghĩa là "chạy' chuỗi' trên giải mã .ipa "bạn đã đúng. Nhưng khi ai đó đã giải mã .ipa của bạn, ứng dụng có thể bị coi là bị xâm phạm và tất cả các phiên cược đều bị tắt. –

+0

hoặc nếu bạn chạy nó trên một iPhone bẻ khóa, bạn có thể làm bất cứ điều gì kể từ khi bạn có quyền truy cập root. –

2

là yêu cầu ứng dụng cho một số phần nội dung của gói ứng dụng - chẳng hạn như byte 59967 của tệp thi hành ứng dụng, hoặc bao gồm plist hoặc xib. Bằng cách giữ cả tên tệp và vị trí được yêu cầu hoàn toàn ngẫu nhiên, bất kỳ ai giả mạo đều phải nhúng toàn bộ bản sao ứng dụng của bạn - điều này giúp bạn dễ dàng xác định xem họ có đang giả mạo ứng dụng của bạn hay không và có thể rất dễ dàng xảy ra với google. Bạn chỉ đơn giản là có khách hàng cung cấp cho bạn số phiên bản và trên máy chủ, bạn sẽ có bản sao của tất cả các tệp cho tất cả các phiên bản công khai để kiểm tra câu trả lời (và quyết định thử thách nào để gửi).

Vì không thể ngăn chặn điều này, điều tốt nhất tiếp theo là phát hiện giả mạo dễ quét nhất có thể và vì vậy tôi nghĩ về các giải pháp giúp bạn quan tâm hơn là cố gắng chặn không thể bỏ chặn (mặc dù một số chặn ban đầu tầm thường sẽ giữ cho riff-raff).

Về cơ bản, nhiều lớp hơn là một lớp thực sự cứng là những gì bạn muốn trong việc đảm bảo điều gì đó.

+0

Tôi thích ý tưởng này, nhưng tôi hoàn toàn không hiểu làm thế nào điều này "làm cho nó rất dễ dàng để xác định xem họ đang giả mạo ứng dụng của bạn"? Tôi đồng ý rằng phát hiện giả mạo gần như là tốt như ngăn chặn nó ở nơi đầu tiên (nếu bạn biết bạn có thể dễ dàng bị bắt, có ít động cơ để làm điều đó ở nơi đầu tiên). Nhưng tôi không chắc chắn cách chương trình này giúp làm điều đó. –

+0

Ngoài các dòng, nó giúp dễ dàng xác định một sản phẩm cụ thể đang giả mạo ứng dụng của bạn, nhiều hơn yêu cầu riêng lẻ đang bị giả mạo - nếu ứng dụng giả mạo ở bất kỳ đâu trên internet, thỉnh thoảng tìm kiếm trên Google một số tệp của bạn có thể tìm thấy nó. Bạn không thể phát hiện một công việc giả mạo thực sự tốt, vì vậy bạn muốn làm cho người khác khó phân phối một thứ gì đó có khả năng giả mạo tốt mà bạn không biết về nó. –

0

Khi ứng dụng khởi động, hãy gửi yêu cầu mã thông báo đến máy chủ.Sau đó, máy chủ gửi một mã thông báo (chỉ là một chuỗi bí mật, mới được tạo) tới máy khách thông qua APNS. Tất cả các giao tiếp tiếp theo đều xác thực với mã thông báo đó. Bạn thậm chí có thể duy trì mã thông báo 'an toàn' bằng cách sử dụng mặt Keychain của iPhone. Trong giới hạn những gì bạn muốn là, thực sự, không thể, nhưng theo cách này bạn dựa vào các công cụ của Apple nhiều hơn một chút.