帮助!
我正在使用 xcode 8 和 swift。我制作了这个应用程序,它可以将数据上传到一些数据被加密的 firebase。在我进行加密之前,我做了一个搜索功能,可以很好地搜索所有数据。现在我已经为一些数据添加了加密,我无法搜索加密的数据。因此我需要在搜索之前对其进行解密,但是我不知道该怎么做。
如果我们一步一步来...
对于加密我使用 RNCryptor 和 Cryptoswift。在我的一个视图控制器中,我制作了一个扩展字符串,其中 2 个函数是:
extension String{
func aesEncrypt(key: String, iv: String) throws -> String {
let data = self.data(using: .utf8)!
let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
let encryptedData = Data(encrypted)
return encryptedData.base64EncodedString()
}
func aesDecrypt(key: String, iv: String) throws -> String {
let data = Data(base64Encoded: self)!
let decrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).decrypt([UInt8](data))
let decryptedData = Data(decrypted)
return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt"
}
}
首先我加密并上传数据:
//Krypterer data
let input = Personnr.text
let input2 = Korekort.text
let key = key1
let iv = key
let en = try! input!.aesEncrypt(key: key!, iv: iv!)
ePersonnr = en
let en2 = try! input2!.aesEncrypt(key: key!, iv: iv!)
eKorekortnr = en2
//Samler alt data om bruger
let data = ["Navn": Navn.text!,
"Telefonnr": Telefonnr.text!,
"Personnr": ePersonnr!,
"Kørekortnr": eKorekortnr!,
"Bil": Bil.text!,
"Interesse": Interesse.text!]
//Oploader til database
self.ref.child("Buyers").child(ePersonnr!).setValue(data)
我从数据库中获得的加密密钥和 iv,但这不是问题。加密后的输出如下图。
如您所见,有些数据是加密的,有些则不是。正如计划。
现在我需要在应用程序中搜索数据。为此,我做了一个搜索功能,其中包括:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if searchController.isActive && searchController.searchBar.text != "" {
return filteredUsers.count
}
return self.usersArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
// Configure the cell...
let user : NSDictionary?
if searchController.isActive && searchController.searchBar.text != "" {
user = filteredUsers[indexPath.row]
}
else
{
user = self.usersArray[indexPath.row]
}
cell.textLabel?.text = user?["Navn"] as? String
cell.detailTextLabel?.text = user?["Telefonnr"] as? String
return cell
}
func filterUsers (searchText:String) {
self.filteredUsers = self.usersArray.filter{ user in
var fNavn = false
var personNr = false
var searchBil = false
var telefonNr = false
var korekortNr = false
if let Navn = user!["Navn"] as? String {
fNavn = Navn.lowercased().contains(searchText.lowercased())
}
if let Bil = user!["Bil"] as? String {
searchBil = Bil.lowercased().contains(searchText.lowercased())
}
//Decryption of data
if let Personnr = user![self.Personnr!] as? String {
personNr = Personnr.lowercased().contains(searchText.lowercased())
}
if let Kørekortnr = user!["Kørekortnr"] as? String {
korekortNr = Kørekortnr.lowercased().contains(searchText.lowercased())
}
if let Telefonnr = user!["Telefonnr"] as? String {
telefonNr = Telefonnr.lowercased().contains(searchText.lowercased())
}
return fNavn || personNr || searchBil || korekortNr || telefonNr
}
tableView.reloadData()
}
问题是因为数据是加密的,我只能搜索加密的字符串,它现在是加密的值。因此我需要做一些事情,让我在搜索之前解密数据?
为此,我需要帮助。
如果您需要任何其他信息或者可能不理解某些代码,请告诉我。
我希望你能帮忙。
帮助!