permissions := strconv.Atoi(os.Getenv("filePermissions"));
fMode := os.FileMode(permissions)
os.chmod(filePath, fMode);
...
String permissionMask = System.getProperty("defaultFileMask");
Path filePath = userFile.toPath();
...
Set<PosixFilePermission> perms = PosixFilePermissions.fromString(permissionMask);
Files.setPosixFilePermissions(filePath, perms);
...
$rName = $_GET['publicReport'];
chmod("/home/". authenticateUser . "/public_html/" . rName,"0755");
...
publicReport
como, por ejemplo, "../../localuser/public_html/.htpasswd
", la aplicaci贸n har谩 que el archivo especificado sea legible para el usuario malintencionado.
...
$mask = $CONFIG_TXT['perms'];
chmod($filename,$mask);
...
permissions = os.getenv("filePermissions");
os.chmod(filePath, permissions);
...
...
rName = req['publicReport']
File.chmod("/home/#{authenticatedUser}/public_html/#{rName}", "0755")
...
publicReport
como, por ejemplo, "../../localuser/public_html/.htpasswd
", la aplicaci贸n har谩 que el archivo especificado sea legible para el usuario malintencionado.
...
mask = config_params['perms']
File.chmod(filename, mask)
...
services-config.xml
especifica un elemento XML "Logging" (Registro) para describir los diferentes aspectos del registro. Tiene un formato similar al siguiente:
<logging>
<target class="flex.messaging.log.ConsoleTarget" level="Debug">
<properties>
<prefix>[BlazeDS]</prefix>
<includeDate>false</includeDate>
<includeTime>false</includeTime>
<includeLevel>false</includeLevel>
<includeCategory>false</includeCategory>
</properties>
<filters>
<pattern>Endpoint.*</pattern>
<pattern>Service.*</pattern>
<pattern>Configuration</pattern>
</filters>
</target>
</logging>
target
toma un atributo opcional que se llama level
, el cual indica el nivel de registro. Si el nivel de depuraci贸n se establece en un nivel demasiado detallado, su aplicaci贸n puede escribir datos confidenciales en el archivo de registro.allowBackup
en true
(el valor predeterminado) y defina el atributo backupAgent
en la etiqueta <application>
.Environment.getExternalStorageDirectory()
devuelve una referencia al almacenamiento externo del dispositivo Android.private void WriteToFile(String what_to_write) {
try{
File root = Environment.getExternalStorageDirectory();
if(root.canWrite()) {
File dir = new File(root + "write_to_the_SDcard");
File datafile = new File(dir, number + ".extension");
FileWriter datawriter = new FileWriter(datafile);
BufferedWriter out = new BufferedWriter(datawriter);
out.write(what_to_write);
out.close();
}
}
}
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
se les har谩 una copia de seguridad en iCloud y en iTunes incluso si se usan copias de seguridad sin cifrar que pueden restaurarse en cualquier dispositivo. Seg煤n el nivel de confidencialidad y privacidad de los datos almacenados, esto puede suponer un problema de privacidad.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleWhenUnlocked forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
se les har谩 una copia de seguridad en iCloud y en iTunes incluso si se usan copias de seguridad sin cifrar que pueden restaurarse en cualquier dispositivo. Seg煤n el nivel de confidencialidad y privacidad de los datos almacenados, esto puede suponer un problema de privacidad.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlocked
SecItemAdd(query as CFDictionary, nil)
...
protected void onCreate(Bundle savedInstanceState) {
...
try {
File httpCacheDir = new File(context.getExternalCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (IOException e) {
Log.i(TAG, "HTTP response cache installation failed:" + e);
}
}
protected void onStop() {
...
HttpResponseCache cache = HttpResponseCache.getInstalled();
if (cache != null) {
cache.flush();
}
}
{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
. diskCapacity
o memoryCapacity
de la clase URLCache
en 0, deshabilitan realmente el sistema de cach茅 de respuesta de HTTP(S). Sin embargo, la documentaci贸n de NSURLCache
indica que tanto la cach茅 del disco como la de la memoria se truncar谩n en los tama帽os configurados 煤nicamente si al dispositivo le queda poca memoria o poco espacio en disco. Ambas configuraciones est谩n dise帽adas para que el sistema libere recursos del sistema y mejore el rendimiento, no como un control de seguridad.{app ID}/Library/Caches/com.mycompany.myapp/Cache.db*
. diskCapacity
o memoryCapacity
de la clase URLCache
en 0, deshabilitan realmente el sistema de cach茅 de respuesta de HTTP(S). Sin embargo, la documentaci贸n de NSURLCache
indica que tanto la cach茅 del disco como la de la memoria se truncar谩n en los tama帽os configurados 煤nicamente si al dispositivo le queda poca memoria o poco espacio en disco. Ambas configuraciones est谩n dise帽adas para que el sistema libere recursos del sistema y mejore el rendimiento, no como un control de seguridad.NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un NSDictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes:ofItemAtPath:error:
, attributesOfItemAtPath:error:
y createFileAtPath:contents:attributes:
. Adem谩s, las constantes de protecci贸n de datos correspondientes se definen para objetos NSData
como NSDataWritingOptions
que pueden pasarse como el argumento options
a las funciones NSData
writeToURL:options:error:
y writeToFile:options:error:
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingFileProtectionNone
:NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
, se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
para determinar si se necesita mayor protecci贸n con NSFileProtectionComplete
.Ejemplo 2: en el siguiente ejemplo, los datos solo est谩n protegidos hasta que el usuario enciende el dispositivo y proporciona el c贸digo de acceso por primera vez (hasta que vuelva a reiniciarse):
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSDictionary *protection = [NSDictionary dictionaryWithObject:NSFileProtectionCompleteUntilFirstUserAuthentication forKey:NSFileProtectionKey];
...
[[NSFileManager defaultManager] setAttributes:protection ofItemAtPath:filepath error:nil];
...
BOOL ok = [testToWrite writeToFile:filepath atomically:YES encoding:NSUnicodeStringEncoding error:&err];
...
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSData *textData = [textToWrite dataUsingEncoding:NSUnicodeStingEncoding];
...
BOOL ok = [textData writeToFile:filepath options:NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication error:&err];
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un Dictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes(_:ofItemAtPath:)
, attributesOfItemAtPath(_:)
y createFileAtPath(_:contents:attributes:)
. Adem谩s, se definen las constantes de protecci贸n de datos correspondientes para objetos NSData
en la enumeraci贸n NSDataWritingOptions
que pueden pasarse como el argumento options
a funciones NSData
writeToFile(_:options:)
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingOptions.DataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingOptions.DataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingOptions.DataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingOptions.DataWritingFileProtectionNone
:NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
, se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionCompleteUnlessOpen
o NSFileProtectionCompleteUntilFirstUserAuthentication
para determinar si se necesita mayor protecci贸n con NSFileProtectionComplete
.Ejemplo 2: en el siguiente ejemplo, los datos determinados solo est谩n protegidos hasta que el usuario enciende el dispositivo y proporciona el c贸digo de acceso por primera vez (hasta el siguiente reinicio).
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
let protection = [NSFileProtectionKey: NSFileProtectionCompleteUntilFirstUserAuthentication]
do {
try NSFileManager.defaultManager().setAttributes(protection, ofItemAtPath: filename)
} catch let error as NSError {
NSLog("Unable to change attributes: \(error.debugDescription)")
}
...
BOOL ok = textToWrite.writeToFile(filename, atomically:true)
...
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
...
BOOL ok = textData.writeToFile(filepath, options: .DataWritingFileProtectionCompleteUntilFirstUserAuthentication);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAfterFirstUnlock
se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAfterFirstUnlock
para determinar si se necesita mayor protecci贸n.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAfterFirstUnlock
se podr谩 cifrar con una clave derivada del c贸digo de acceso del usuario y del UID del dispositivo, los datos seguir谩n siendo accesibles en determinadas circunstancias. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAfterFirstUnlock
para determinar si se necesita mayor protecci贸n.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
SecItemAdd(query as CFDictionary, nil)
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un NSDictionary
asociado a la instancia de NSFileManager
, y se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes:ofItemAtPath:error:
, attributesOfItemAtPath:error:
y createFileAtPath:contents:attributes:
. Adem谩s, las constantes de protecci贸n de datos correspondientes se definen para objetos NSData
como NSDataWritingOptions
que pueden pasarse como el argumento options
a las funciones NSData
writeToURL:options:error:
y writeToFile:options:error:
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingFileProtectionNone
:NSFileProtectionNone
provoca un cifrado con una clave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionNone
para determinar si se necesita mayor protecci贸n con una clase de protecci贸n de datos m谩s estricta.Ejemplo 2: en el siguiente ejemplo, los datos no est谩n protegidos (son accesibles en todo momento cuando el dispositivo est谩 encendido):
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSDictionary *protection = [NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey];
...
[[NSFileManager defaultManager] setAttributes:protection ofItemAtPath:filepath error:nil];
...
BOOL ok = [testToWrite writeToFile:filepath atomically:YES encoding:NSUnicodeStringEncoding error:&err];
...
...
filepath = [self.GetDocumentDirectory stringByAppendingPathComponent:self.setFilename];
...
NSData *textData = [textToWrite dataUsingEncoding:NSUnicodeStingEncoding];
...
BOOL ok = [textData writeToFile:filepath options:NSDataWritingFileProtectionNone error:&err];
...
NSFileManager
como constantes que deben asignarse como el valor de la clave NSFileProtectionKey
en un Dictionary
asociado a la instancia de NSFileManager
. Se pueden crear archivos o modificar su clase de protecci贸n de datos mediante el uso de funciones NSFileManager
como setAttributes(_:ofItemAtPath:)
, attributesOfItemAtPath(_:)
y createFileAtPath(_:contents:attributes:)
. Adem谩s, se definen constantes de protecci贸n de datos correspondientes para objetos NSData
en la enumeraci贸n NSDataWritingOptions
que pueden pasarse como el argumento options
a funciones NSData
como
writeToFile(_:options:)
. Las definiciones de las diversas constantes de clases de protecci贸n de datos para NSFileManager
y NSData
son las siguientes:NSFileProtectionComplete
, NSDataWritingOptions.DataWritingFileProtectionComplete
:NSFileProtectionCompleteUnlessOpen
, NSDataWritingOptions.DataWritingFileProtectionCompleteUnlessOpen
:NSFileProtectionCompleteUntilFirstUserAuthentication
, NSDataWritingOptions.DataWritingFileProtectionCompleteUntilFirstUserAuthentication
:NSFileProtectionNone
, NSDataWritingOptions.DataWritingFileProtectionNone
:NSFileProtectionNone
provoca un cifrado con una clave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de NSFileProtectionNone
para determinar si se necesita mayor protecci贸n con una clase de protecci贸n de datos m谩s estricta.Ejemplo 2: en el siguiente ejemplo, los datos determinados no est谩n protegidos (es decir, son accesibles en todo momento cuando el dispositivo est谩 encendido).
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
let protection = [NSFileProtectionKey: NSFileProtectionNone]
do {
try NSFileManager.defaultManager().setAttributes(protection, ofItemAtPath: filename)
} catch let error as NSError {
NSLog("Unable to change attributes: \(error.debugDescription)")
}
...
BOOL ok = textToWrite.writeToFile(filename, atomically:true)
...
...
let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let filename = "\(documentsPath)/tmp_activeTrans.txt"
...
BOOL ok = textData.writeToFile(filepath, options: .DataWritingFileProtectionNone);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAlways
provoca un cifrado con una llave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAlways
para determinar si se necesita mayor protecci贸n con un nivel de accesibilidad de las llaves m谩s estricto.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessible
en el diccionario de atributos de las claves. Las definiciones de las diversas constantes de accesibilidad de las claves son las siguientes:kSecAttrAccessibleAfterFirstUnlock
:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleAlways
provoca un cifrado con una llave derivada exclusivamente del UID del dispositivo. Esto permite que se pueda acceder a dichos archivos siempre que el dispositivo est谩 encendido, incluso cuando est谩 bloqueado con un c贸digo de acceso o durante el arranque. Por lo tanto, deben revisarse con atenci贸n los usos de kSecAttrAccessibleAlways
para determinar si se necesita mayor protecci贸n con un nivel de accesibilidad de las llaves m谩s estricto.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleAlways
SecItemAdd(query as CFDictionary, nil)
...
Realm
sin cifrar:
Realm realm = Realm.getDefaultInstance();
Realm
sin cifrar:
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil];
Realm
sin cifrar:
let realm = try! Realm()
UIImageWriteToSavedPhotosAlbum
para guardar las im谩genes en el 谩lbum de fotos:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// Access the uncropped image from info dictionary
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// Save image
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
...
}
UIImageWriteToSavedPhotosAlbum
para guardar las im谩genes en el 谩lbum de fotos:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.contentMode = .ScaleAspectFit
imageView.image = pickedImage
}
// Save image
UIImageWriteToSavedPhotosAlbum(pickedImage!, self, nil, nil)
dismissViewControllerAnimated(true, completion: nil)
}
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
, si luego roban su dispositivo y se establece un c贸digo de acceso, el ladr贸n deber谩 desbloquear el dispositivo para descifrar los elementos de las llaves. Si no se introduce el c贸digo de acceso correcto, se bloquear谩 el descifrado de los elementos de las llaves del dispositivo robado. Sin embargo, si no se establece un c贸digo de acceso, el atacante solo necesitar谩 deslizar el dedo para desbloquear el dispositivo y obtener las llaves para descifrar sus elementos. Por lo tanto, no exigir un c贸digo de acceso en el dispositivo puede debilitar el mecanismo de cifrado de las llaves.
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
, si luego roban su dispositivo y se establece un c贸digo de acceso, el ladr贸n deber谩 desbloquear el dispositivo para descifrar los elementos de las llaves. Si no se introduce el c贸digo de acceso correcto, se bloquear谩 el descifrado de los elementos de las llaves del dispositivo robado. Sin embargo, si no se establece un c贸digo de acceso, el atacante solo necesitar谩 deslizar el dedo para desbloquear el dispositivo y obtener las llaves para descifrar sus elementos. Por lo tanto, no exigir un c贸digo de acceso en el dispositivo puede debilitar el mecanismo de cifrado de las llaves.
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
SecItemAdd(query as CFDictionary, nil)
...
setPersistent:YES
.
...
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
[pasteboard setPersistent:YES];
...
setPersistent(true)
.
...
let pasteboard = UIPasteboard(name: UIPasteboard.Name(rawValue: "myPasteboard"), create: true)!
pasteboard.setPersistent(true)
...
Access Control Policy
que concede acceso an贸nimo completo al contenedor foo
.
GetBucketAclRequest bucketAclReq = GetBucketAclRequest.builder().bucket("foo").build();
GetBucketAclResponse getAclRes = s3.getBucketAcl(bucketAclReq);
List<Grant> grants = getAclRes.grants();
Grantee allusers = Grantee.builder().uri("http://acs.amazonaws.com/groups/global/AllUsers").build();
Permission fc_permission = Permission.fromValue("FullControl");
Grant grant = Grant.builder().grantee(allusers).permission(fc_permission).build();
grants.add(grant);
AccessControlPolicy acl = AccessControlPolicy.builder().grants(grants).build();
Access Control Policy
que concede un permiso an贸nimo de lectura de la ACP en el contenedor foo
.
GetBucketAclRequest bucketAclReq = GetBucketAclRequest.builder().bucket("foo").build();
GetBucketAclResponse getAclRes = s3.getBucketAcl(bucketAclReq);
List<Grant> grants = getAclRes.grants();
Grantee allusers = Grantee.builder().uri("http://acs.amazonaws.com/groups/global/AllUsers").build();
Permission fc_permission = Permission.fromValue("READ_ACP");
Grant grant = Grant.builder().grantee(allusers).permission(fc_permission).build();
grants.add(grant);
AccessControlPolicy acl = AccessControlPolicy.builder().grants(grants).build();
Access Control Policy
que concede acceso an贸nimo de lectura al contenedor foo
.
GetBucketAclRequest bucketAclReq = GetBucketAclRequest.builder().bucket("foo").build();
GetBucketAclResponse getAclRes = s3.getBucketAcl(bucketAclReq);
List<Grant> grants = getAclRes.grants();
Grantee allusers = Grantee.builder().uri("http://acs.amazonaws.com/groups/global/AllUsers").build();
Permission fc_permission = Permission.fromValue("Read");
Grant grant = Grant.builder().grantee(allusers).permission(fc_permission).build();
grants.add(grant);
AccessControlPolicy acl = AccessControlPolicy.builder().grants(grants).build();
Access Control Policy
que concede un permiso an贸nimo de escritura de la ACP en el contenedor foo
.
GetBucketAclRequest bucketAclReq = GetBucketAclRequest.builder().bucket("foo").build();
GetBucketAclResponse getAclRes = s3.getBucketAcl(bucketAclReq);
List<Grant> grants = getAclRes.grants();
Grantee allusers = Grantee.builder().uri("http://acs.amazonaws.com/groups/global/AllUsers").build();
Permission fc_permission = Permission.fromValue("WRITE_ACP");
Grant grant = Grant.builder().grantee(allusers).permission(fc_permission).build();
grants.add(grant);
AccessControlPolicy acl = AccessControlPolicy.builder().grants(grants).build();