在swift中保存图片,用户无法访问

问题描述:

我有一个应用程序,允许用户拍照并立即保存,但它们当前存储在应用程序文档目录中,可通过iFunBox等程序访问。这是我如何保存图像。在swift中保存图片,用户无法访问

 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回答我加密后的图片保存之前,在读取时,使用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) 
} 

也得到这项工作中迅速出现了一些问题与AES256,所以我加了一些类的RNEncryptor.hRNEncryptor.mRNDecryptor.hRNDecryptor.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]; } 
+1

NSUserDefaults。 – Arbitur

+0

这是他们的设备。没有什么可以做,以防止他们如果他们选择窥探。 –

+0

因此,服务器上传是解决这个问题的最好方法吗? – inVINCEable

保存与writeToFile:options:error:NSDataWritingFileProtectionComplete一个NSDataWritingOptions或明确加密,并根据需要保存在Keychain的密码解密,看到RNCryptor一个很好的加密程序。

通常将大数据项目保存在数据库中并不是一个好的解决方案。

+0

因此,从技术上讲,我可以将图像保存到使用此方法加密的文档目录上? – inVINCEable

+0

是的,在Documents目录中保存照片的加密版本是安全的。 RNCryptor是一个很好的加密程序,它可以完成所有需要完成的繁琐工作。 Keychain易于使用,因为关键是弱点。如果'NSDataWritingFileProtectionComplete'足够满足您的需求,请检查结果,因为它非常简单,透明地处理加密密钥。 – zaph

如果将它保存在设备的任何位置,用户都可以访问它们。

所以有两条路可以在这个叉子上。 将它保存到设备时保持加密。并在您的应用程序需要时解密。 (查找sqlCipher for iPhone它是超级安全的) 保留在服务器上,只下载显示,但从不保存。

+1

感谢您的帮助 – inVINCEable

+0

通常在数据库中保存大量数据不是一个可取的解决方案。如果您需要数据库功能,请使用数据库,而不是加密。 – zaph

+2

如果你需要加密的东西,RNCrytpor是一个不错的选择。 https://github.com/RNCryptor/RNCryptor –