para migrar a un Ubutun, me gustaría exportar toda mi contraseña, por ejemplo, a un archivo CSV.
En Keychain Access, encontré el menú de exportación, pero siempre está deshabilitado, incluso cuando el acceso está desbloqueado.
¿Qué tengo que hacer?
para migrar a un Ubutun, me gustaría exportar toda mi contraseña, por ejemplo, a un archivo CSV.
En Keychain Access, encontré el menú de exportación, pero siempre está deshabilitado, incluso cuando el acceso está desbloqueado.
¿Qué tengo que hacer?
Respuestas:
Esto es solo acerca de cómo lo hice hace muchos años, esta es la actualización de script para Yosemite 10.11.5 , pero no lo he probado.
Una secuencia de comandos que guarda cada elemento del llavero en texto:
security dump-keychain -d login.keychain > keychain.txt
Un segundo elemento de AppleScript que hace clic en el botón "Permitir" que activa el primer script al leer el elemento de KeyChain.
[Edición: julio de 2016] Esto se actualizó a la nota 10.11.5 ya que algunos informaron haber bloqueado su Mac con el retraso de 0.2, he limitado el script para procesar solo 200 resultados a la vez, por lo tanto, si tiene 1050 elementos de llavero , deberá ejecutar este script 6 veces en ScriptEditor, también deberá permitir que ScriptEditor esté habilitado en la sección Accesibilidad en las preferencias de seguridad en:
tell application "System Events"
set maxAttemptsToClick to 200
repeat while exists (processes where name is "SecurityAgent")
if maxAttemptsToClick = 0 then exit repeat
set maxAttemptsToClick to maxAttemptsToClick - 1
tell process "SecurityAgent"
try
click button 2 of window 1
on error
keystroke " "
end try
end tell
delay 0.2
end repeat
end tell
Luego, la actualización de enlace / yosemite anterior también tiene un paso de conversión de rubí del archivo de texto a CSV, ¡Buena suerte!
ShreevatsaR señala en los comentarios que esta conversión de rubí solo cubre "contraseñas de Internet" y no "contraseñas de aplicación". Esto se debe a que el objetivo del script es exportar las "contraseñas de Internet" a la aplicación 1Password.
Y aquí hay una pregunta y una respuesta de desbordamiento de pila en la misma línea
El System.keychain está aquí:
security dump-keychain -d /Library/Keychains/System.keychain > systemkeychain.txt
Para permitir que AppleScript interactúe con el cuadro de diálogo Preferencias del sistema -> Preferencias de seguridad y privacidad -> Pestaña Privacidad, la opción de accesibilidad debe tener habilitado "Script Editor.app"

Escribí un script de Python que convierte el volcado de llavero en un archivo de Excel y pensé en compartirlo contigo. Elijo Excel sobre CSV o TSV porque mucha gente lo tiene instalado y simplemente funciona haciendo doble clic en el archivo. Por supuesto, puede modificar el script para imprimir cualquier otro formato. Lo hice en OS X 10.11 El Capitan, pero también debería funcionar en sistemas operativos más antiguos.
Como no me gusta almacenar mis contraseñas en texto plano en mi disco duro, creé un contenedor cifrado con la aplicación Disk Utility. Simplemente abra la Utilidad de Discos (presione cmd+ Space, escriba "disco"). En la aplicación, presione cmd+ Npara obtener una nueva imagen, cambie el nombre a SEC, cambie el cifrado a AES de 256 bits y guárdelo en SEC en el directorio que elija. Luego monte el volumen haciendo doble clic en el archivo (o usando la Utilidad de Discos).
Cree un nuevo archivo llamado keychain.py en el contenedor seguro y pegue el código a continuación.
Ahora abra Terminal.app y cambie el directorio al volumen cifrado montado: cd /Volumes/SEC
Necesitamos el administrador de paquetes de Python para instalar el módulo de Excel (se le pedirá su contraseña): sudo easy_install pip
Necesitamos instalar el módulo Python Excel: sudo pip install xlwt
Ahora exporte las contraseñas con una de las otras respuestas a esta pregunta. Simplemente lo hice security dump-keychain -d > keychain.txty el spam hizo clic en el botón Permitir mientras sostenía el mouse con la otra mano.
El último paso es convertir el archivo txt a una hoja de Excel legible utilizando el script python: python keychain.py keychain.txt keychain.xls
.
#!/usr/bin/env python
import sys
import os
import re
import xlwt
# Regex to match both generic and internet passwords from a keychain dump
regex = re.compile(
r"""
keychain:\s"(?P<kchn>[^"]+)"\n # absolute path and file of keychain
version:\s(\d\d\d)\n # version
class:\s"(?P<clss>(genp|inet))"\n # generic password or internet password
attributes:\n
(\s*?0x00000007\s<blob>=(?P<name>[^\n]+)\n)? # name
(\s*?0x00000008\s<blob>=(?P<hex8>[^\n]+)\n)? # ? only used at certificates
(\s*?"acct"<blob>=(?P<acct>[^\n]+)\n)? # account
(\s*?"atyp"<blob>=(?P<atyp>[^\n]+)\n)? # account type ("form"), sometimes int
(\s*?"cdat"<timedate>=[^"]*(?P<cdat>[^\n]+)\n)? # datetime created
(\s*?"crtr"<uint32>=(?P<crtr>[^\n]+)\n)? # vendor key with four chars like "aapl"
(\s*?"cusi"<sint32>=(?P<cusi>[^\n]+)\n)? # ? always null
(\s*?"desc"<blob>=(?P<desc>[^\n]+)\n)? # description
(\s*?"gena"<blob>=(?P<gena>[^\n]+)\n)? # ? always null except one rare cases
(\s*?"icmt"<blob>=(?P<icmt>[^\n]+)\n)? # ? some sort of description
(\s*?"invi"<sint32>=(?P<invi>[^\n]+)\n)? # ? always null
(\s*?"mdat"<timedate>=[^"]*(?P<mdat>[^\n]+)\n)? # datetime last modified
(\s*?"nega"<sint32>=(?P<nega>[^\n]+)\n)? # ? always null
(\s*?"path"<blob>=(?P<path>[^\n]+)\n)? # path
(\s*?"port"<uint32>=(?P<port>[^\n]+)\n)? # port number in hex
(\s*?"prot"<blob>=(?P<prot>[^\n]+)\n)? # ? always null
(\s*?"ptcl"<uint32>=(?P<ptcl>[^\n]+)\n)? # protocol but is blob ("http", "https")
(\s*?"scrp"<sint32>=(?P<scrp>[^\n]+)\n)? # ? always null except one rare cases
(\s*?"sdmn"<blob>=(?P<sdmn>[^\n]+)\n)? # used for htaccess AuthName
(\s*?"srvr"<blob>=(?P<srvr>[^\n]+)\n)? # server
(\s*?"svce"<blob>=(?P<svce>[^\n]+)\n)? # ? some sort of description
(\s*?"type"<uint32>=(?P<type>[^\n]+)\n)? # some blob: "iprf", "note"
data:\n
"(?P<data>[^"]*)" # password
""", re.MULTILINE | re.VERBOSE)
# Dictionary used by the clean function (Apple is not always right about the
# types of the field)
field2type = {
"name": "blob",
"hex8": "blob",
"acct": "blob",
"atyp": "simple",
"cdat": "timedate",
"crtr": "uint32",
"cusi": "sint32",
"desc": "blob",
"gena": "blob",
"icmt": "blob",
"invi": "sint32",
"mdat": "timedate",
"nega": "sint32",
"path": "blob",
"port": "uint32",
"prot": "blob",
"ptcl": "blob",
"scrp": "sint32",
"sdmn": "blob",
"srvr": "blob",
"svce": "blob",
"type": "blob",
"data": "simple",
"kchn": "simple",
"clss": "simple"
}
def clean(field, match):
value = match.group(field)
if not value or value == "<NULL>":
# print null values as empty strings
return ""
if field2type[field] == "blob":
# strip " at beginning and end
return value[1:-1]
elif field2type[field] == "timedate":
# convert timedate to the iso standard
value = value[1:-1]
return value[0:4] + "-" + value[4:6] + "-" + value[6:8] + "T" + \
value[8:10] + ":" + value[10:12] + ":" + value[12:14] + "Z" + value[16:19]
elif field2type[field] == "uint32":
# if it really is a hex int, convert it to decimal
value = value.strip()
if re.match("^0x[0-9a-fA-F]+$", value):
return int(value, 16)
else:
return value
else:
# do nothing, just print it as it is
return value
def print_help():
print "Usage: python keychain.py INPUTFILE OUTPUTFILE"
print "Example: python keychain.py keychain.txt keychain.xls"
print " where keychain.txt was created by `security dump-keychain -d > keychain.txt`"
print " When dumping the keychain, you have to click 'Allow' for each entry in your"
print " keychain. Position you mouse over the button and go clicking like crazy."
print "Keychain 0.1: convert an Apple Keychain dump to an Excel (XLS) spreadsheet."
# Check for correct parameters
if len(sys.argv) != 3:
print_help()
sys.exit(1)
elif len(sys.argv) == 3:
if not os.path.isfile(sys.argv[1]):
print "Error: no such file '{0}'".format(sys.argv[1])
print_help()
exit(1)
# Read keychain file
buffer = open(sys.argv[1], "r").read()
print "Read {0} bytes from '{1}'".format(len(buffer), sys.argv[1])
# Create excel workbook and header
wb = xlwt.Workbook()
ws = wb.add_sheet("Keychain")
ws.write(0, 0, "Name")
ws.write(0, 1, "Account")
ws.write(0, 2, "Password")
ws.write(0, 3, "Protocol")
ws.write(0, 4, "Server")
ws.write(0, 5, "Port")
ws.write(0, 6, "Path")
ws.write(0, 7, "Description")
ws.write(0, 8, "Created")
ws.write(0, 9, "Modified")
ws.write(0, 10, "AuthName")
ws.write(0, 11, "AccountType")
ws.write(0, 12, "Type")
ws.write(0, 13, "Keychain")
# Find passwords and add them to the excel spreadsheet
i = 1
for match in regex.finditer(buffer):
ws.write(i, 0, clean("name", match))
ws.write(i, 1, clean("acct", match))
ws.write(i, 2, clean("data", match))
ws.write(i, 3, clean("ptcl", match))
ws.write(i, 4, clean("srvr", match))
ws.write(i, 5, clean("port", match))
ws.write(i, 6, clean("path", match))
ws.write(i, 7, clean("desc", match))
ws.write(i, 8, clean("cdat", match))
ws.write(i, 9, clean("mdat", match))
ws.write(i, 10, clean("sdmn", match))
ws.write(i, 11, clean("atyp", match))
ws.write(i, 12, clean("clss", match))
ws.write(i, 13, clean("kchn", match))
i += 1
wb.save(sys.argv[2])
print "Saved {0} passwords to '{1}'".format(i-1, sys.argv[2])
A partir de OSX 10.10.3 hay una nueva forma de aceptar automáticamente (me encontré con problemas durante una ruta de actualización)
Funciones Bash (añadir a cualquiera .profileo .bash_rcarchivos)
## At the terminal when you start getting the prompts, type `Accepts` and press enter
function Accepts () {
osascript <<EOF
tell application "System Events"
repeat while exists (processes where name is "SecurityAgent")
tell process "SecurityAgent" to click button "Allow" of window 1
delay 0.2
end repeat
end tell
EOF
}
## At the terminal when you start getting the prompts, type `Accepts YourUsername YourPassword` and press enter
function AcceptWithCreds () {
username="$1"
password="$2"
[ -z "${password}" ] && return 1
osascript 2>/dev/null <<EOF
set appName to "${username}"
set appPass to "${password}"
tell application "System Events"
repeat while exists (processes where name is "SecurityAgent")
tell process "SecurityAgent"
if exists (text field 1 of window 1) then
set value of text field 1 of window 1 to appName
set value of text field 2 of window 1 to appPass
end if
end tell
tell process "SecurityAgent" to click button "Allow" of window 1
delay 0.2
end repeat
end tell
EOF
echo 'Finished...'
}
Y use este script para volcar su llavero ( sudo ./dump.sh)
#!/bin/bash
# Run above script in another window
security dump-keychain -d login.keychain > keychain-login.txt
security dump-keychain -d /Library/Keychains/System.keychain > keychain-system.txt
execution error: System Events got an error: osascript is not allowed assistive access.a la línea de comando. La forma más fácil que encontré para lidiar con esto fue pegar el código AppleScript en la aplicación Script Editor y ejecutarlo desde allí.
osascript is not allowed assistive accesserror se puede evitar permitiendo que su aplicación Terminal en Preferencias del sistema => Seguridad y privacidad => Accesibilidad.
La respuesta de @ MichaelStoner es un buen comienzo, pero falla en OS X 10.10.3 Yosemite, con su informe de código AppleScript System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.
Después de jugar un poco, la siguiente solución funcionó para mí:
tell application "System Events"
repeat while exists (processes where name is "SecurityAgent")
tell process "SecurityAgent"
keystroke " "
end tell
delay 1
end repeat
end tell
Deberá hacer clic en el cuadro de diálogo "Permitir" después de comenzar esto. Este código llevará un tiempo, pero desaconsejo reducir el retraso ("retraso 0.2" me obligó a apagar mi Mac). Solo toma una taza de café.
La función de exportación de llavero es para ARTÍCULOS, no para todo el llavero. Tampoco le permitirá exportar la mayoría de los elementos, que es cuando verá la función de exportación atenuada.
Para copiar el llavero de una Mac a otra, use la aplicación Migration Assistant .
O hágalo manualmente copiando el archivo de cadena ubicado en la carpeta ~ / Library / Keychains /.
Abra la aplicación Keychain Access en una computadora nueva y elija File> Add Keychain….
El securitybinario recuperará elementos del llavero desde la línea de comando, por lo que podría escribirlo en Python para volcar el contenido sistemáticamente. Realmente depende de qué formato desea los datos y cómo los usará en el futuro.
Copiar / pegar también es una opción decente si sabe cuánto tiempo desea implementar una nueva solución y si necesita aprender / buscar un programa o biblioteca existente que volcará el contenido al formato elegido.
El menú de elementos de exportación es para la exportación de claves públicas y / o privadas para las que existen formatos de archivo estándar de la industria para codificar y proteger los datos según corresponda cuando se almacenan en el sistema de archivos para su intercambio y transporte. Esa función se documenta brevemente en la ayuda de Keychain Assistant.
Hay una herramienta llamada KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .
Para extraer Passphrase / Account / Payment / Secure Note / PublicKey / PrivateKey / SymmetricKey / Certificate y así sucesivamente desde Keychain en silencio.