DANH MỤC TÀI LIỆU
Phương thức bảo mật tối thiểu cần phải có cho mọi ứng dụng iOS
Phân tích mã đc gm hai phương pháp chính là phân tích
tĩnh và phân tích đng. Trong bài này, chúng ta s tìm hiu v
nhng công c, phương pháp phân tích mã đc, da trên nn tng
c thWindows.
B o m t ng d ng c a b n là m t trong nh ng khía c nh quan tr ng nh t ậ ứ
c a phát tri n ph n m m. ầ ề
Ng i dùng ng d ng c a chúng ta hy v ng r ng các thông tin c a h đangườ ủ ọ
đ c gi m t cách riêng t và an toàn.ượ ữ ộ ư
Trong bài vi t này, chúng ta s th o lu n nh ng sai l m mà các nhà phát ế ẽ ả
tri n th c hi n đ i v i b o m t ng d ng và cách kh c ph c chúng. ậ ứ
L u tr d li u nh y c m sai v tríư ữ ữ
Tôi đã nghiên c u nhi u ng d ng t AppStorenhi u ng d ng trong s ứ ụ ứ ụ
đó đang th c hi n cùng m t l i, l u tr d li u nh y c m n i chúng ư ữ ữ ở ơ
không thu c v .ộ ề
N u b n đang l u tr nh ng d li u nh y c m đó trongế ư ữ ệ UserDefaults, thì
b n đang m o hi m thông tin c a ng i dùng. ạ ể ườ
UserDefaults đ c l u tr đ n gi n nh m t t p danh sách các thu c tính ượ ư ữ ơ ư
n m bên trong th m c ư Preferences trong ng d ng c a b n. Chúng đ c ủ ạ ượ
l u trong ng d ng c a chúng ta mà không b mã hóa d i b t kì hình th c ư ướ ấ
nào.
V c b n, b ng cách s d ng ng d ng c a bên th ba c a h đi u ề ơ
hành macOS ví d nhụ ư iMazing, th m chí không c n ph i Jailbreak thi t b ế ị
c a b n, b n có th d dàng xem d li u UserDefaults cho b t kỳ ng ấ ứ
d ng nào đ c t i xu ng t ượ ả AppStore.
Các ng d ng trênứ ụ macOS này đ c thi t k đ n gi n đ cho phép b n ượ ế ế ơ
khám phá và qu n lý các t p ng d ng c a bên th ba trên iPhone c a b n. ệ ứ
Và b n có th d dàng khám phá ể ễ UserDefaultsc a b t kỳ ng d ng nào.ủ ấ
Lý do khi n tôi vi t bài này là tôi đã phát hi n ra r ng r t nhi u ng d ng ế ế ề ứ
mà tôi đã cài đ t t AppStore đang l u d li u nh y c m c a tôi ặ ừ ư ữ ệ
vào UserDefaults.
Có th l y ví d nhể ấ ư Access Tokens, S l ng ti n trong game, v.v.ố ượ
T t c các d li u này có th d dàng l y ra và thay đ i qua đó gây thi t ể ễ
h i cho các ng d ng, t vi c s d ng mi n phí các tính năng tr ti n đ ử ụ
hack h th ng và nhi u đi u khác n a.ệ ố
Cách đúng đ làm đi u đóể ề
You can also store items like the and that you manage with Certificate, Key,
and Trust Services.
B n nên luôn ghi nh m t đi u khi l u d li u trên ng d ng ư ữ ệ
iOS, UserDefaults đ c thi t k ch đ l u tr m t l ng nh d li u nh ượ ế ế ể ư ượ ư
s thích c a ng i dùng, cài đ t đ n gi n bên trong ng d ng, nh ng th ườ ặ ơ
hoàn toàn không nh y c m.ạ ả
Đ l u các d li u nh y c m c a ng d ng, chúng ta nên s d ng các d ch ư ệ ạ ứ ụ
v b o m t do Apple cung c p.ụ ả
Keychain API giúp b n gi i quy t nh ng v n đ này b ng cách cung c p ế ấ ề
cho ng d ng c a b n m t cách đ l u tr l ng d li u nh c a ng i ụ ủ ư ượ ủ ườ
dùng trong c s d li u đ c mã hóa có tên làơ ở ượ keychain.
Trong keychain, b n đ c t do l u m t kh u và các bí m t khác mà ng i ượ ự ư ườ
dùng quan tâm m t cách rõ ràng, ch ng h n nh thông tin th tín d ng ho c ẳ ạ ư
th m chí nh ng dòng ghi chú nh y c m ng n. ạ ả
Keychain Services API
D i đây mình s mô t cách b n có th l u m t kh u c a ng i dùng c aướ ể ư ườ
b n bên trong keychain.
class KeychainService {
func save(_ password: String, for account: String) {
let password = password.data(using: String.Encoding.utf8)!
let query: [String: Any] = [kSecClass as String:
kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: password]
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else { return print("save error")
}
}
trong dictionary mình có ph n kSecClass: kSecClassGenericPassword cho Ở ầ
bi t m c đó là m t kh u, t đóế keychain api hi u r ng d li u yêu c u ữ ệ
đ c mã hóa.ượ
Sau đó, chúng ta thêm m t kh u m i vàoậ ẩ keychain b ng cách
g i SecItemAdd v i truy v n mà chúng ta v a t o. ừ ạ
L y d li u t ng t : ữ ệ ươ
func retrivePassword(for account: String) -> String? {
let query: [String: Any] = [kSecClass as String:
kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecReturnData as String: kCFBooleanTrue]
var retrivedData: AnyObject? = nil
let _ = SecItemCopyMatching(query as CFDictionary, &retrivedData)
guard let data = retrivedData as? Data else {return nil}
return String(data: data, encoding: String.Encoding.utf8)
}
Chúng ta có th vi t m t unit test đ n gi n đ đ m b o r ng d li u đ c ế ơ ể ả ượ
l u và truy xu t chính xácư ấ
func testPaswordRetrive() {
let password = "123456"
let account = "User"
keyChainService.save(password, for: account)
XCTAssertEqual(keyChainService.retrivePassword(for: account),
password)
}
Keychain API có v h i ph c t p khi s d ng l n đ u tiên n u b n ph i ẻ ơ ử ụ ế
l u nhi u h n m t m t kh u, mình khuy n khích b n dùngư ề ơ ế facade
pattern giúp b n l u và s a đ i d li u theo cách t t nh t tùy thu c vào ư ữ ệ
tr ng h p s d ng ng d ng c a b n.ườ ử ụ
N u b n mu n bi t thêm vế ạ ế facade pattern và cách t o m t wrappers đ n ạ ộ ơ
gi n cho các h th ng con ph c t p, thì ứ ạ bài vi tế này có th giúp b n r t ạ ấ
nhi u.
Ngoài ra, có r t nhi u th vi n mã ngu n m giúp vi c s d ng API ư ử ụ
Keychain đ n gi n h n. M t s trong s đó ơ ơ ộ ố
là SAMKeychain và SwiftKeychainWrapper.
L u m t kh u và th c hi n vi c xác th cư ự ệ
R t nhi u l n Nhà phát tri n l u m t kh u ch a qua mã hoá trên ng d ng ề ầ ể ư ư
đ s d ng l i ho c g i login request tr c ti p b ng tên ng i dùng và m tể ử ế ườ
kh u.
N u b n đang l u tr m t kh u tr c ti p trongế ư ữ ậ ế UserDefault thì b n nên
bi t bây gi b n có r t nhi u r i ro t thông tin đ c cung c p trong ph n ế ờ ạ ượ
đ u tiên c a bài vi t này.ầ ủ ế
L u m t kh u vàoư ậ ẩ Keychain đ m b o an ninh m c đ t t h n nh ng sau ộ ố ơ ư
đó, chúng ta luôn ph i l u m t kh u và thông tin nh y c m khác vào khóa ả ư
ho c n i khác b ng cách mã hóa chúng.ặ ở ơ
Gi s k t n công có th hack thông qua b o m t keychain ho c t n công ặ ấ
chúng ta thông qua qua network c a chúng ta, t đó k đó có th truy xu t ừ ẻ
tr c ti p m t kh u c a chúng ta d i d ng văn b n thô. ế ướ ạ
Cách ti p c n t t h n là l u tr m t kh u và s d ng chúng cho các yêu ế ơ ư ử ụ
c u đăng nh p d i d ng băm đ c t o cho m t kh u này. ướ ượ ạ
Mã hóa d li u nh y c mữ ệ
Vi c t th c hi n vi c băm có th th c s ph c t p và quá m c c n thi t, ệ ự ứ ạ ế
vì v y trong bài vi t này, chúng ta s s d ng s tr giúp c a m t th vi n ế ẽ ử ư
mã ngu n m c a iOS ở ủ CryptoSwift.
CryptoSwift là m t b s u t p các thu t toán mã hóa tiêu chu n và an toàn ộ ư
đ c th c hi n trong Swift và đ c c p nh t th ng xuyên.ượ ượ ậ ườ
Hãy th l u và l y l i m t kh u trênử ư keychain b ng cách s d ng các thu t ử ụ
toán đ c cung c p b iượ CryptoSwift.
func saveEncryptedPassword(_ password: String, for account: String) {
let salt = Array("salty".utf8)
let key = try! HKDF(password: Array(password.utf8), salt: salt, variant:
.sha256).calculate().toHexString()
keychainService.save(key, for: account)
}
Ph ng th c này có m t tài kho n và m t kh u và l u m t chu i băm ươ ậ ẩ ư
trên Keychain thay vì m t chu i tr c ti p. ỗ ự ế
Chúng tôi t o ra salt đ làm cho vi c t n công tr nên khó khăn h n. ệ ấ ơ
N u chúng ta ch băm nh m t kh u c a mình, hacker có th có danh sách ế ỏ ậ
các m t kh u đ c s d ng nhi u nh t và t o các hash c a chúng và so ượ ử ụ
thông tin tài liệu
Bảo mật ứng dụng của bạn là một trong những khía cạnh quan trọng nhất của phát triển phần mềm. Người dùng ứng dụng của chúng ta hy vọng rằng các thông tin của họ đang được giữ một cách riêng tư và an toàn. Trong bài viết này, chúng ta sẽ thảo luận những sai lầm mà các nhà phát triển thực hiện đối với bảo mật ứng dụng và cách khắc phục chúng.
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×