để di chuyển sang Ubutun, tôi muốn xuất tất cả mật khẩu của mình, ví dụ như tệp CSV.
Trong Keychain Access, tôi đã tìm thấy menu xuất, nhưng nó luôn bị vô hiệu hóa, ngay cả khi quyền truy cập được mở khóa.
Tôi nên làm gì?
để di chuyển sang Ubutun, tôi muốn xuất tất cả mật khẩu của mình, ví dụ như tệp CSV.
Trong Keychain Access, tôi đã tìm thấy menu xuất, nhưng nó luôn bị vô hiệu hóa, ngay cả khi quyền truy cập được mở khóa.
Tôi nên làm gì?
Câu trả lời:
Đây chỉ là cách tôi đã làm nó nhiều năm trước, đây là bản cập nhật kịch bản cho Yosemite 10.11.5 - nhưng tôi đã không thử nghiệm nó.
Một tập lệnh lưu từng mục trong Keychain thành văn bản:
security dump-keychain -d login.keychain > keychain.txt
Mục AppleScript thứ hai nhấp vào nút "Cho phép" mà tập lệnh thứ nhất kích hoạt khi đọc mục đó ra khỏi KeyChain.
[Chỉnh sửa: Tháng 7 năm 2016] Điều này đã được cập nhật lên 10.11.5 lưu ý vì một số người đã báo cáo việc khóa máy Mac của họ với độ trễ 0,2, tôi đã giới hạn tập lệnh chỉ xử lý 200 kết quả cùng một lúc, do đó, nếu bạn có 1050 mục móc khóa , bạn sẽ cần chạy tập lệnh này 6 lần trong ScriptEditor, bạn cũng sẽ phải cho phép ScriptEditor được bật trong phần Trợ năng trong tùy chọn bảo mật trong:
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
Sau đó, cập nhật liên kết / yosemite ở trên cũng có bước chuyển đổi ruby từ tệp văn bản sang CSV, Chúc may mắn!
ShreevatsaR chỉ ra trong các ý kiến rằng việc chuyển đổi ruby này chỉ bao gồm "mật khẩu internet" chứ không phải "mật khẩu ứng dụng". Điều này là do mục đích của kịch bản là xuất "mật khẩu internet" vào ứng dụng 1Password
.
Và đây là một câu hỏi tràn chồng và trả lời cùng một dòng
System.keychain có ở đây:
security dump-keychain -d /Library/Keychains/System.keychain > systemkeychain.txt
Để cho phép AppleScript tương tác với hộp thoại, Tùy chọn hệ thống -> Tùy chọn bảo mật & quyền riêng tư -> Tab riêng tư, Tùy chọn trợ năng phải được bật "Script Editor.app"
Tôi đã viết một tập lệnh python chuyển đổi kết xuất móc khóa thành tệp Excel và nghĩ rằng tôi chia sẻ nó với bạn. Tôi chọn Excel trên CSV hoặc TSV vì nhiều người đã cài đặt nó và nó chỉ hoạt động bằng cách nhấp đúp vào tệp. Tất nhiên bạn có thể sửa đổi tập lệnh để in bất kỳ định dạng nào khác. Tôi đã làm điều này trên OS X 10.11 El Capitan, nhưng cũng nên hoạt động trên hệ điều hành cũ hơn '.
Vì tôi không thích lưu trữ mật khẩu của mình trên ổ cứng, tôi đã tạo một thùng chứa được mã hóa bằng ứng dụng Disk Utility. Chỉ cần mở Disk Utility (nhấn cmd+ Space, gõ "đĩa"). Trong ứng dụng, nhấn cmd+ Ncho hình ảnh mới, thay đổi tên thành SEC, thay đổi mã hóa thành AES 256-bit và lưu nó dưới SEC trong một thư mục bạn chọn. Sau đó gắn kết âm lượng bằng cách nhân đôi trên tệp (hoặc sử dụng Disk Utility).
Tạo một tệp mới có tên là móc khóa trong bộ chứa an toàn và dán mã bên dưới.
Bây giờ hãy mở Terminal.app và thay đổi thư mục thành ổ đĩa được mã hóa: cd /Volumes/SEC
Chúng tôi cần trình quản lý gói python để cài đặt mô-đun Excel (bạn sẽ được nhắc nhập mật khẩu): sudo easy_install pip
Chúng ta cần cài đặt mô-đun Python Excel: sudo pip install xlwt
Bây giờ xuất mật khẩu bằng một trong những câu trả lời khác cho câu hỏi này. Tôi vừa làm security dump-keychain -d > keychain.txt
và spam nhấp vào nút Cho phép trong khi giữ chuột bằng tay kia.
Bước cuối cùng là chuyển đổi tệp txt thành bảng Excel có thể đọc được bằng cách sử dụng tập lệnh 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])
Kể từ OSX 10.10.3, có một cách mới để tự động chấp nhận (tôi gặp vấn đề trong quá trình nâng cấp)
Hàm Bash (được thêm vào một trong hai .profile
hoặc .bash_rc
tệp)
## 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...'
}
Và sử dụng tập lệnh này để kết xuất keyring của bạn ( 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.
ở dòng lệnh. Cách dễ nhất tôi tìm thấy để giải quyết vấn đề này là dán mã AppleScript vào ứng dụng Script Editor và chạy nó từ đó.
osascript is not allowed assistive access
thể tránh lỗi bằng cách cho phép ứng dụng Terminal của bạn trong System Preferences => Security & Privacy => Access.
Câu trả lời của @ MichaelStoner là một khởi đầu tốt, nhưng nó đã thất bại trên OS X 10.10.3 Yosemite, với báo cáo mã AppleScript của anh ấy System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index
.
Sau khi chơi xung quanh một chút, giải pháp sau đây có hiệu quả với tôi:
tell application "System Events"
repeat while exists (processes where name is "SecurityAgent")
tell process "SecurityAgent"
keystroke " "
end tell
delay 1
end repeat
end tell
Bạn sẽ phải nhấp vào hộp thoại "Cho phép" sau khi bắt đầu việc này. Mã này sẽ mất một chút thời gian, nhưng tôi khuyên bạn không nên giảm độ trễ ("độ trễ 0,2" khiến tôi buộc phải tắt máy Mac). Chỉ cần lấy một tách cà phê.
Chức năng Keychain Keychain dành cho ITEMS, không phải cho toàn bộ móc khóa. Nó cũng sẽ không cho phép bạn xuất hầu hết các Mục - đó là khi bạn sẽ thấy chức năng Xuất ra màu xám.
Để sao chép móc khóa từ máy Mac này sang máy khác, hãy sử dụng ứng dụng Trợ lý di chuyển .
Hoặc thực hiện thủ công bằng cách sao chép tệp chuỗi khóa nằm trong thư mục ~ / Library / Keychains /.
Mở ứng dụng Keychain Access trên máy tính mới và chọn File
> Add Keychain…
.
Các security
nhị phân sẽ lấy các mục từ keychain từ dòng lệnh, vì vậy bạn có thể kịch bản mà trong python để đổ nội dung một cách hệ thống. Nó thực sự phụ thuộc vào định dạng bạn muốn dữ liệu và cách bạn sẽ sử dụng nó trong tương lai.
Sao chép / dán cũng là một lựa chọn hợp lý nếu bạn biết bạn quan tâm đến việc thực hiện một giải pháp mới trong bao lâu và liệu bạn có cần học / tìm kiếm một chương trình hoặc thư viện hiện có sẽ chuyển nội dung sang định dạng bạn đã chọn hay không.
Menu mục xuất là dành cho xuất công khai và / hoặc khóa riêng có các định dạng tệp tiêu chuẩn công nghiệp để mã hóa và bảo vệ dữ liệu khi thích hợp khi được lưu trữ vào hệ thống tệp để trao đổi và vận chuyển. Chức năng đó được ghi lại ngắn gọn trong trợ giúp cho Keychain Assistant.
Có một công cụ gọi KeychaindumpPro https://hackforums.net/showthread.php?tid=5804486 .
Để trích xuất Cụm mật khẩu / Tài khoản / Thanh toán / Ghi chú an toàn / PublicKey / PrivateKey / SymmetricKey / Chứng chỉ, v.v. từ Keychain trong im lặng.