将图片保存在用户无法访问的 swift 中
Save pictures in swift where users can't access
我有一个允许用户拍照并立即保存的应用程序,但是它们目前存储在应用程序文档目录中,可以通过 iFunBox 等程序访问该目录。这是我保存图片的方法。
var imageName = "SomeGeneratedImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var data = UIImageJPEGRepresentation(image, 1)
data.writeToFile(path, atomically: true)
我应该把图片保存在哪里,这样用户即使通过 iFunBox 等程序也无法访问它们?
更新 - 使用的答案
基于 zaph's answer i encrypted the pictures before saving and when reading, using RNEncrytor 这是我的保存功能:
var imageName = "someImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var data = UIImageJPEGRepresentation(image, 1) //change 1 for compression
let encryptedData = RNEncryptor.faireseEncryptData(data, password: "password", error: nil)
encryptedData.writeToFile(path, atomically: true)
和
var imageName = "thatSameImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var decryptedImg = RNDecryptor.faireseDecryptData(NSData(contentsOfFile: path), password: "theSamePass", error: nil)
if(decryptedImg != nil) {
//alert
var image: UIImage? = UIImage(data: decryptedImg)
}
也为了让它在 swift 中工作,AES256 出现了一些问题,所以我在 RNEncryptor.h
、RNEncryptor.m
、[=20 中添加了一些 类 =],以及 RNDecryptor.m
//To RNEncrpytor.h
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;
.
//To RNEncryptor.m
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }
.
//To RNDecryptor.h
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;
.
//TO RNDecryptor.m
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNDecryptor decryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }
如果您将其保存在设备上的任何位置,用户就可以访问它们。
所以在这个岔路口有两条路可以走。
将其保存到设备时对其进行加密。并在您的应用程序需要时解密。 (查一下sqlCipher for iPhone超级安全)
保存在服务器,只下载展示,不保存
使用 writeToFile:options:error:
保存 NSDataWritingOptions
或 NSDataWritingFileProtectionComplete
或根据需要显式加密和解密,将密码保存在钥匙串中,请参阅 RNCryptor 以获得良好的加密例程。
通常将大数据项保存在数据库中并不是一个好的解决方案。
我有一个允许用户拍照并立即保存的应用程序,但是它们目前存储在应用程序文档目录中,可以通过 iFunBox 等程序访问该目录。这是我保存图片的方法。
var imageName = "SomeGeneratedImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var data = UIImageJPEGRepresentation(image, 1)
data.writeToFile(path, atomically: true)
我应该把图片保存在哪里,这样用户即使通过 iFunBox 等程序也无法访问它们?
更新 - 使用的答案
基于 zaph's answer i encrypted the pictures before saving and when reading, using RNEncrytor 这是我的保存功能:
var imageName = "someImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var data = UIImageJPEGRepresentation(image, 1) //change 1 for compression
let encryptedData = RNEncryptor.faireseEncryptData(data, password: "password", error: nil)
encryptedData.writeToFile(path, atomically: true)
和
var imageName = "thatSameImageName.jpeg"
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = documentsDirectory.stringByAppendingPathComponent(imageName)
var decryptedImg = RNDecryptor.faireseDecryptData(NSData(contentsOfFile: path), password: "theSamePass", error: nil)
if(decryptedImg != nil) {
//alert
var image: UIImage? = UIImage(data: decryptedImg)
}
也为了让它在 swift 中工作,AES256 出现了一些问题,所以我在 RNEncryptor.h
、RNEncryptor.m
、[=20 中添加了一些 类 =],以及 RNDecryptor.m
//To RNEncrpytor.h
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;
.
//To RNEncryptor.m
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }
.
//To RNDecryptor.h
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;
.
//TO RNDecryptor.m
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNDecryptor decryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }
如果您将其保存在设备上的任何位置,用户就可以访问它们。
所以在这个岔路口有两条路可以走。 将其保存到设备时对其进行加密。并在您的应用程序需要时解密。 (查一下sqlCipher for iPhone超级安全) 保存在服务器,只下载展示,不保存
使用 writeToFile:options:error:
保存 NSDataWritingOptions
或 NSDataWritingFileProtectionComplete
或根据需要显式加密和解密,将密码保存在钥匙串中,请参阅 RNCryptor 以获得良好的加密例程。
通常将大数据项保存在数据库中并不是一个好的解决方案。