Actualizar Passwords en el Llavero de macOS

El Llavero es la utilidad de macOS que permite almacenar las contraseñas en la cuenta del usuario para las aplicaciones, pero la capacidad de actualizar una contraseña para un elemento determinado del Llavero, hasta Xojo 2025r1, implicaba el tener que borrar dicho elemento previamente para volver a crearlo desde cero con la nueva contraseña. Sigue leyendo y te mostraré cómo puedes hacerlo ahora más fácilmente gracias al método KeychainItem.UpdatePassword.

A partir de Xojo 2025r1 ya no es necesario que borres previamente un elemento del Llavero si lo único que quieres hacer es modificar su contraseña. A partir de ahora lo único que se requiere es contar con una instancia válida de KeychainItem cuya propiedad Handle no sea igual a 0; y para obtener una referencia de un KeychainItem inicializado de forma adecuada… nada mejor que utilizar el método System.Keychain.FindPassword. Por ejemplo, el siguiente código utilizado en un método, cuya signatura es FindPassword( serviceName As String) As KeychainItem:

Var itemToFind As new KeychainItem
Var password As String

' Nombre de servicio que queremos encontrar
ItemToFind.ServiceName = serviceName

' Obtén la contraseña
password = System.Keychain.FindPassword( itemToFind )

Return itemToFind

Catch e as KeychainException
  Return nil

Se encargará de recuperar una contraseña para el elemento del Llavero cuyo Nombre de Servicio coincida con el parámetro recibido en la propiedad serviceName. Si nuestra llamada a System.Keychain.FindPassword resulta en una excepción KeychainException, esto significará que no se ha encontrado un item en el Llavero que se corresponda con el Nombre de Servicio proporcionado… de modo que simplemente devolverá Nil, mientras que si el método puede recuperar la contraseña para dicho Nombre de Servicio esto significará que contaremos con un KeychainItem inicializado correctamente y que podremos usar en combinación con el método UpdatePassword para actualizar la contraseña asociada con dicho elemento. Así de simple.

Por ejemplo, añadamos un nuevo método con la siguiente signatura:

Public Sub CreatePassword(Pass As String, label As string, serviceName As String)
  // Veamos si ya existe una contraseña para dicho elemento
  // Si es así, entonces sólo tendremos que actualizar
  // la contraseña en vez de crear un nuevo elemento!
  
  var itemToFind as KeychainItem = FindPassword( serviceName )
  
  // Si no obtenemos un KeychainItem como Nil, significará que
  // podemos actualizar la contraseña para dicho KeychainItem,
  // en vez de crear uno nuevo desde cero!
  
  if itemToFind <> nil then
     itemToFind.UpdatePassword( pass )
  else
  
    // Si obtenemos Nil… eso significará que no existe
    // dicho elemento en el Llavero del usuario, de modo
    // que tendremos que crearlo.
    
    itemToFind = new KeychainItem
    itemToFind.Label = Label
    itemToFind.ServiceName = serviceName
    System.Keychain.AddPassword( itemToFind, pass )
  end if
  
  Catch e as KeychainException
    MessageBox("Keychain error: " + e.Message)
    
End Sub

Como puedes ver, este método recibe un total de tres cadenas como parámetros: la contraseña que queremos definir o actualizar, la etiqueta que utilizaremos para el elemento del Llavero (especialmente interesante cuando se añade una nueva contraseña al Llavero para un Nombre de Servicio determinado), y el Nombre de Servicio propiamente dicho y que estará asociado con la contraseña.

Lo primero que hace este método es llamar al método FindPassword que hemos visto previamente. Si dicho método devuelve un objeto que no sea Nil… esto significará que simplemente hemos de actualizar la contraseña, mientras que si el método FindPassword devuelve Nil, entonces hemos de crear un nuevo KeychainItem desde cero utilizando los valores de etiqueta (label), y nombre de servicio (serviceName) recibidos. Luego sólo tendremos que añadir la contraseña asociada con dicho elemento mediante la llamada a System.Keychain.AddPassword.

Descarga este proyecto de ejemplo de modo que puedas experimentar añadiendo, borrando y/o actualizando contraseñas en el Llavero de tu cuenta macOS.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *