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

时间:2015-04-06 18:33:11

标签: ios swift ios8 nsdocumentdirectory

我有一个应用程序允许用户拍照并立即保存,但是它们当前存储在应用程序文档目录中,可以通过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回答,我在保存前和阅读时加密了图片,使用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.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]; }

2 个答案:

答案 0 :(得分:4)

保存writeToFile:options:error: NSDataWritingOptions NSDataWritingFileProtectionComplete或根据需要明确加密和解​​密,保存密码链中的密码,请参阅RNCryptor以获取良好的加密例程。

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

答案 1 :(得分:2)

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

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