2012-05-09 28 views
5

CÓ, tôi đã đọc tất cả tài liệu @ developer.android.com và tôi hiểu tất cả chỉ với một ngoại lệ cơ bản - những gì được giới thiệu.Thanh toán trong ứng dụng Android - những gì thực sự không phải dành cho?

Vì tất cả các phản hồi đơn đặt hàng từ Google Play được ký bởi khóa cá nhân không thể truy cập và đang được xác minh bằng khóa công cộng được ghép nối (trong trường hợp của tôi trên máy chủ bên ngoài, vì vậy nó cũng không thể truy cập được đối với người thứ ba)) không có cách nào để giả mạo.

Tất cả những người không phải chỉ là cách dự phòng để đảm bảo mua hàng. Và còn gì nữa, tài liệu không nói gì về tình huống này, khi:

  1. Tôi mua một mặt hàng;
  2. Tạo nonce và gửi cho Google Play;
  3. Có sự cố, vì vậy, tất cả các nonce đã biết của bạn bị mất;
  4. Ứng dụng của tôi đã khởi động lại và nhận được cuộc gọi lại từ Google Play;
  5. ... Và từ chối cuộc gọi này do không được công nhận nonce!

Trong trường hợp được mô tả ở trên, người dùng thanh toán cho một mặt hàng và không bao giờ nhận được nó, điều đáng xấu hổ. Tất nhiên tôi có thể lưu trữ nonces trong một số tập tin và đọc lại nó khi ứng dụng của tôi trở lại, nhưng nó vi phạm tất cả các nguyên tắc cho nonces.

IMHO ai đó vừa nói "Này, quá trình xác minh quá đơn giản, hãy thêm điều gì đó ngẫu nhiên hơn, nó sẽ trở nên thú vị hơn!". Vì vậy, ai đó đã làm.

Hoặc bạn có muốn mở một số trường hợp sử dụng khác không? Nếu không, tôi sẽ xóa toàn bộ phần không phải từ mã của tôi.

+0

Nếu mua được quản lý, hãy nhớ luôn luôn có khả năng khôi phục mua hàng , người dùng sẽ cần nếu họ bao giờ 1. nhận thiết bị mới, 2. phải khôi phục cài đặt gốc cho thiết bị. – weston

+0

Bạn nói đúng, tôi đã quên chúng vì tôi không có, nhưng làm thế nào nó được kết nối với nonces? –

+0

Chỉ cần "người dùng của bạn trả tiền cho một mục và không bao giờ được nó" kịch bản không phải là một vấn đề nếu bạn xảy ra được sử dụng mua được quản lý, vì vậy không cần phải lo lắng về việc mất nonces trong trường hợp đó. Tôi không tuyên bố đó là một câu trả lời, chỉ là một bình luận! – weston

Trả lời

2

Bạn không cần phải lưu trữ các nonce 'vào đĩa' để giải thích cho một vụ tai nạn ứng dụng xem.

Khi ứng dụng của bạn gặp sự cố, bạn sẽ mất danh sách các nonces đã biết. Tuy nhiên, khi ứng dụng của bạn khởi động lại và bạn nhận được IN_APP_NOTIFY thì bạn phải thực hiện GET_PURCHASE_INFORMATION khi bạn thực hiện điều này GET_PURCHASE_INFORMATION bạn sẽ tạo một nonce mới và thêm nó vào danh sách nonces đã biết.

Những gì bạn phải nhớ là số không là một trên mỗi GET_PURCHASE_INFORMATION (trả về cho bạn nhiều mặt hàng đã mua) không phải một số không cho mỗi mặt hàng được mua.

AS bạn đã nói bạn đã thực hiện theo cách của riêng bạn để tránh tấn công Replay, nhưng sử dụng một nonce là một lần như vậy an toàn phương pháp

+1

Vâng, cảm ơn, tôi nghĩ rằng bạn đã nhấn mắt của con bò. Nonces nên được coi là một trong nhiều cách để đối phó với các cuộc tấn công trả lời trong trường hợp bạn không kiểm tra cái gì khác độc đáo - i. e. orderId trong JSON (IMHO tốt hơn nhiều). Trong trường hợp của tôi, họ là vô ích, mặc dù. –

0

Bạn phải lưu các nonce được tạo trước khi gửi chúng. Các ứng dụng Android có thể bị lỗi hoặc bị tắt bất kỳ lúc nào, vì vậy nói chung mọi thứ sẽ được lưu lại.

Lý do sử dụng nonces là prevent replay attacks. Tôi xa đủ điều kiện để trả lời việc sử dụng nonce là cần thiết hay không nhưng tôi cho rằng nó có lý do.

+1

Tôi đang lưu chúng trong bộ nhớ, lưu chúng trên đĩa cục bộ để lộ chúng cho người khác đọc/giả/bất cứ điều gì. Tôi không phải lo lắng về các cuộc tấn công trả lời, bởi vì như tôi đã đề cập các phím bất đối xứng là đủ an toàn cho tôi để chắc chắn không có gì bị giả mạo bởi bất cứ ai. –

+0

Từ quan điểm bảo mật "trên đĩa" không khác với "trong bộ nhớ". Nếu điện thoại của bạn là ứng dụng gốc sẽ có quyền truy cập cả hai. Nếu không bắt nguồn từ, họ sẽ phải khai thác các lỗi bảo mật để truy cập vào một trong hai. – richardwiden

+0

Bạn có muốn nói với người dùng của mình rằng bạn _THINK_ rằng phương pháp _YOUR_ là an toàn _ENOUGH_ không? – richardwiden

0

Hãy tưởng tượng người dùng của bạn mua một mặt hàng cho phép nói 100 đô la. Ứng dụng của bạn được thông báo rằng có sẵn dữ liệu thanh toán, ứng dụng yêu cầu dữ liệu và câu trả lời AppStore với PURCHASE_STATE_CHANGED. Người dùng ghi lại thông báo (!) Từ AppStore và giữ cho nó lưu lại.

Sau đó, người dùng sẽ gửi thông báo cho ứng dụng của bạn, thông báo rằng dữ liệu thanh toán có sẵn (bất kỳ ai cũng có thể giả mạo, vì thông báo này chưa được ký). Ứng dụng này nghĩ rằng "ồ, này, có lẽ tôi vừa bị rơi và mất tất cả thông tin về giao dịch mua mà người dùng của tôi vừa tạo ra !? Hãy xem những gì AppStore phải nói". Vì vậy, nó yêu cầu dữ liệu từ cửa hàng ứng dụng. Người dùng ngắt yêu cầu đó và gửi tin nhắn đã ghi trước đó đến ứng dụng của bạn. Ứng dụng nhìn thấy thông báo, xác minh nó và thấy rằng nó là hợp lệ (vì nó đã được ký và tất cả). Vì vậy, ứng dụng sẽ cung cấp cho bạn một mặt hàng trị giá 100 đô la khác. Và cái khác. Thường xuyên khi người dùng phát lại tin nhắn đã ghi. Do đó được gọi là: một cuộc tấn công phát lại.

Tuy nhiên, có một điều ngăn chặn một cuộc tấn công như vậy: nonce. Nếu ứng dụng của bạn gửi một nonce trong yêu cầu của nó cho dữ liệu thanh toán, ứng dụng sẽ nhận được cùng một nonce đó trong câu trả lời PURCHASE_STATE_CHANGED. Như một nonce chỉ được sử dụng một lần, bạn không thể phát lại các tin nhắn đã ghi trước đó, bởi vì chúng sẽ không khớp với nonce được sử dụng trong yêu cầu.

+0

Nó không chính xác như thế. Đề án bạn đã giới thiệu là ok, nhưng nó vẫn không hiển thị những gì không phải là cho - Tôi nhận thức được vấn đề như là tấn công trả lời, nhưng tôi giải quyết nó theo cách khác - tôi đang phản ứng rất tốt với Google Play trên máy chủ bên ngoài của tôi, nơi tôi giữ khóa công khai của mình. Hơn nữa, để tránh tình huống như vậy bạn đã đề cập, mỗi khi tôi làm điều đó tôi lưu orderId duy nhất mà đi kèm trong JSON đã ký - nó không thể được giả mạo, gây ra nó đã được ký và nó được đảm bảo duy nhất. Tôi chỉ đơn giản là bỏ qua 2 msg với cùng một orderId. Dường như nonces thật sự vô dụng (thậm chí còn nhiều hơn - có hại như tôi đã nói). –

0

"Các hành vi không giống như một muối trên giao dịch, tương tự như cách hệ thống * nix lưu mật khẩu. Mã nonce được sử dụng để thêm entropy vào giá trị được mã hóa bằng khóa của bạn, phần lớn loại bỏ khả năng hai giao dịch được mã hóa và dẫn đến cùng một chữ ký và các cuộc tấn công mã hóa tương tự khác. "

the answer by queso

Các vấn đề liên quan