Quy tắc bảo mật ứng dụng đầu tiên: Bất kỳ máy nào mà kẻ tấn công có được quyền truy cập vật lý hoặc điện tử không bị hạn chế đều thuộc về kẻ tấn công của bạn, bất kể nó thực sự ở đâu hoặc bạn đã trả tiền cho nó.
Quy tắc bảo mật ứng dụng thứ hai: Bất kỳ phần mềm nào rời khỏi ranh giới vật lý mà kẻ tấn công không thể xâm nhập giờ đều thuộc về kẻ tấn công của bạn, bất kể bạn đã dành bao nhiêu thời gian để mã hóa nó.
Quy tắc thứ ba: Bất kỳ thông tin nào để lại những ranh giới vật lý tương tự mà kẻ tấn công không thể xâm nhập bây giờ thuộc về kẻ tấn công của bạn, bất kể nó có giá trị như thế nào đối với bạn.
Các nền tảng của bảo mật công nghệ thông tin dựa trên ba nguyên tắc cơ bản này; máy tính thực sự an toàn duy nhất là máy tính bị khóa trong két, bên trong lồng Farraday, bên trong lồng thép. Có những máy tính dành phần lớn thời gian phục vụ của chúng chỉ trong trạng thái này; mỗi năm một lần (hoặc ít hơn), họ tạo ra các khóa riêng cho các cơ quan chứng nhận gốc đáng tin cậy (trước một loạt các nhân chứng có camera ghi lại từng inch của căn phòng nơi họ đặt).
Bây giờ, hầu hết các máy tính không được sử dụng trong các loại môi trường này; chúng thực sự hoạt động ngoài trời, được kết nối với Internet qua kênh radio không dây. Nói tóm lại, họ dễ bị tổn thương, cũng như phần mềm của họ. Do đó họ không được tin tưởng. Có một số điều mà máy tính và phần mềm của chúng phải biết hoặc làm để có ích, nhưng phải cẩn thận để đảm bảo rằng chúng không bao giờ có thể biết hoặc làm đủ để gây ra thiệt hại (ít nhất là không gây ra thiệt hại vĩnh viễn ngoài giới hạn của máy đơn lẻ đó ).
Bạn đã biết tất cả điều này; đó là lý do tại sao bạn đang cố gắng bảo vệ mã ứng dụng của mình. Nhưng, đó là vấn đề đầu tiên; các công cụ obfuscation có thể làm cho mã trở thành một mớ hỗn độn để con người cố gắng tìm hiểu, nhưng chương trình vẫn phải chạy; điều đó có nghĩa là luồng logic thực tế của ứng dụng và dữ liệu mà nó sử dụng không bị ảnh hưởng bởi obfuscation. Với một chút kiên trì, kẻ tấn công có thể đơn giản làm xáo trộn mã và điều đó thậm chí không cần thiết trong một số trường hợp mà những gì anh ta nhìn vào không thể là gì khác ngoài những gì anh ta đang tìm kiếm.
Thay vào đó, bạn nên cố gắng đảm bảo rằng kẻ tấn công không thể làm bất cứ điều gì với mã của bạn, bất kể anh ta có dễ dàng lấy được bản sao rõ ràng của nó hay không. Điều đó có nghĩa là, không có bí mật được mã hóa cứng, bởi vì những bí mật đó không phải là bí mật ngay khi mã rời khỏi tòa nhà nơi bạn phát triển nó.
Những giá trị khóa mà bạn đã mã hóa cứng phải được loại bỏ hoàn toàn khỏi mã nguồn của ứng dụng. Thay vào đó, họ nên ở một trong ba nơi; bộ nhớ dễ bay hơi trên thiết bị, khó hơn (nhưng vẫn không phải là không thể) để kẻ tấn công có được bản sao ngoại tuyến; vĩnh viễn trên cụm máy chủ mà bạn kiểm soát truy cập bằng nắm đấm sắt; hoặc trong kho lưu trữ dữ liệu thứ hai không liên quan đến thiết bị hoặc máy chủ của bạn, chẳng hạn như thẻ vật lý hoặc trong bộ nhớ người dùng của bạn (có nghĩa là cuối cùng nó sẽ ở trong bộ nhớ dễ bay hơi, nhưng nó không phải tồn tại lâu).
Hãy xem xét các sơ đồ sau. Người dùng nhập thông tin đăng nhập của họ cho ứng dụng từ bộ nhớ vào thiết bị. Thật không may, bạn phải tin rằng thiết bị của người dùng chưa bị xâm nhập bởi keylogger hoặc Trojan; cách tốt nhất bạn có thể làm trong vấn đề này là triển khai bảo mật đa yếu tố, bằng cách ghi nhớ thông tin nhận dạng khó giả mạo về các thiết bị mà người dùng đã sử dụng (MAC / IP, IMEI, v.v.) và cung cấp ít nhất một kênh bổ sung bằng cách mà một nỗ lực đăng nhập trên một thiết bị lạ có thể được xác minh.
Thông tin đăng nhập, sau khi được nhập, bị phần mềm máy khách che khuất (sử dụng hàm băm an toàn) và thông tin đăng nhập văn bản đơn giản bị loại bỏ; họ đã phục vụ mục đích của họ. Thông tin đăng nhập bị xáo trộn được gửi qua một kênh bảo mật đến máy chủ được chứng thực chứng chỉ, điều này sẽ băm chúng một lần nữa để tạo ra dữ liệu được sử dụng để xác minh tính hợp lệ của thông tin đăng nhập. Bằng cách này, khách hàng không bao giờ biết cái gì thực sự được so sánh với giá trị cơ sở dữ liệu, máy chủ ứng dụng không bao giờ biết thông tin xác thực phía sau những gì nó nhận được để xác thực, máy chủ dữ liệu không bao giờ biết cách dữ liệu mà nó lưu trữ để xác thực được tạo ra và một người đàn ông trong phần giữa chỉ thấy vô nghĩa ngay cả khi kênh an toàn bị xâm phạm.
Sau khi xác minh, máy chủ sẽ truyền lại mã thông báo qua kênh. Mã thông báo chỉ hữu ích trong phiên bảo mật, bao gồm tiếng ồn ngẫu nhiên hoặc bản sao được mã hóa (và do đó có thể kiểm chứng) của mã định danh phiên và ứng dụng khách phải gửi mã thông báo này trên cùng một kênh đến máy chủ như một phần của bất kỳ yêu cầu nào làm gì đó. Ứng dụng khách sẽ thực hiện việc này nhiều lần, bởi vì nó không thể làm bất cứ điều gì liên quan đến tiền, dữ liệu nhạy cảm hoặc bất kỳ thứ gì khác có thể gây hại cho chính nó; thay vào đó, nó phải yêu cầu máy chủ thực hiện nhiệm vụ này. Ứng dụng khách sẽ không bao giờ ghi bất kỳ thông tin nhạy cảm nào vào bộ nhớ liên tục trên chính thiết bị, ít nhất là không ở dạng văn bản thuần túy; khách hàng có thể yêu cầu máy chủ qua kênh bảo mật để lấy khóa đối xứng để mã hóa bất kỳ dữ liệu cục bộ nào mà máy chủ sẽ ghi nhớ; trong phiên sau, máy khách có thể yêu cầu máy chủ cung cấp cùng khóa để giải mã dữ liệu để sử dụng trong bộ nhớ dễ bay hơi. Dữ liệu đó sẽ không phải là bản sao duy nhất; bất cứ thứ gì khách hàng lưu trữ cũng nên được truyền dưới dạng nào đó đến máy chủ.
Rõ ràng, điều này làm cho ứng dụng của bạn phụ thuộc rất nhiều vào truy cập Internet; thiết bị khách không thể thực hiện bất kỳ chức năng cơ bản nào của nó mà không có kết nối và xác thực hợp lệ của máy chủ. Không khác gì Facebook, thật đấy.
Bây giờ, máy tính mà kẻ tấn công muốn là máy chủ của bạn, bởi vì nó và không phải ứng dụng / thiết bị khách là thứ có thể giúp anh ta kiếm tiền hoặc khiến người khác đau đớn vì sự thích thú của anh ta. Vậy là được rồi; bạn sẽ nhận được nhiều tiền hơn cho việc bạn bỏ ra tiền và công sức để bảo mật máy chủ hơn là cố gắng bảo mật tất cả các máy khách. Máy chủ có thể đứng sau tất cả các loại tường lửa và bảo mật điện tử khác, ngoài ra có thể được bảo mật về mặt vật lý đằng sau quyền truy cập thép, bê tông, thẻ khóa / pin và giám sát video 24 giờ. Kẻ tấn công của bạn sẽ cần phải rất tinh vi để có thể truy cập trực tiếp vào máy chủ và bạn sẽ (nên) biết về nó ngay lập tức.
Điều tốt nhất mà kẻ tấn công có thể làm là đánh cắp điện thoại và thông tin đăng nhập của người dùng và đăng nhập vào máy chủ với các quyền hạn chế của khách hàng. Nếu điều này xảy ra, giống như mất thẻ tín dụng, người dùng hợp pháp nên được hướng dẫn gọi một số 800 (tốt nhất là dễ nhớ và không phải ở mặt sau của thẻ mà họ mang theo trong ví, ví hoặc cặp có thể bị đánh cắp cùng với thiết bị di động) từ bất kỳ điện thoại nào họ có thể truy cập kết nối chúng trực tiếp với dịch vụ khách hàng của bạn. Họ tuyên bố điện thoại của họ đã bị đánh cắp, cung cấp một số định danh duy nhất cơ bản và tài khoản bị khóa, mọi giao dịch mà kẻ tấn công có thể đã xử lý được khôi phục và kẻ tấn công trở lại hình vuông.