Tôi là người hoang tưởng. Tôi không muốn chia sẻ mật khẩu của mình với người quản lý mật khẩu. Tôi không muốn viết chúng ra hoặc gõ chúng ở bất cứ đâu
Tôi thậm chí không muốn nhìn thấy chúng bằng chính đôi mắt của mình, bao giờ hết
tôi không muốn nhớ đến họ. Tôi muốn mỗi người và tất cả mọi người là duy nhất với 17 ký tự, với tất cả những quy tắc buồn cười đó về việc có ít nhất một chữ hoa, một chữ thường, một chữ số, một ký tự đặc biệt, v.v.
Tôi không muốn chương trình keylogger có thể chặn mật khẩu của mình. Và tôi không bao giờ muốn mất bất kỳ mật khẩu nào của mình
Tôi có đòi hỏi quá nhiều không?
à há
Gần đây, khi đang loay hoay với các ý tưởng lập trình Python, tôi lại có một tia sáng khác “Aha. ” thời điểm, và mã trong bài viết này được sinh ra. Có, nó đáp ứng tất cả các yêu cầu nêu trên. Hãy để tôi giải thích
Một số bối cảnhĐầu tiên, trước khi tôi đi sâu vào phần giải thích về chương trình, đây là một ví dụ về cách bạn sử dụng nó
Khi bạn được nhắc nhập mật khẩu, hãy sao chép toàn bộ URL của trang web bạn đang truy cập vào khay nhớ tạm
Chạy chương trình urlpassword.py
. Nó sẽ hoạt động, yêu cầu khóa cá nhân ngắn của bạn, sau đó biến mất rất nhanh, không có mật khẩu hoặc bất kỳ thứ gì khác ngoài khóa của bạn hiển thị trên màn hình. Cuối cùng, chỉ cần dán từ khay nhớ tạm của bạn vào trường mật khẩu và bạn đã hoàn tất
Trong hầu hết các trường hợp, mật khẩu là duy nhất cho miền mà bạn đang đăng nhập từ đó
Hãy xem URL hoặc dòng địa chỉ web trong trình duyệt của bạn khi bạn đang đăng nhập ở một nơi nào đó và bạn sẽ thấy địa chỉ miền chính bắt đầu bằng một cái gì đó như //
và theo sau là một số dữ liệu bổ sung xác định chính xác bạn đang ở đâu trong miền đó
Ví dụ: khi bạn đăng nhập vào Amazon, tên miền chính là www.amazon.com
, đối với Google là www.google.com
, v.v. Với Python, thật dễ dàng trích xuất chuỗi miền lõi đó từ URL đầy đủ, bất kể đó là gì. Nhưng tên miền chỉ là một phần của những gì được sử dụng để tạo mật khẩu duy nhất của bạn
Chương trình urlpassword.py
được sửa đổi dành riêng cho bạn. Rất đơn giản để thay đổi mã và tôi sẽ chỉ cho bạn chính xác cách thức và vị trí thay đổi mã sau một chút nữa
Nếu ai đó muốn lấy bản sao chương trình này từ máy tính của bạn, họ vẫn cần biết khóa của bạn [số pin ngân hàng là lý tưởng, nhưng bất kỳ chuỗi ngắn nào dễ nhập và dễ nhớ đều hoàn hảo] nếu không họ sẽ tạo ra một
Ảnh của MinuteKEY trên Bapt
Tương tự như vậy, một kẻ xấu đã lấy chìa khóa của bạn thông qua chương trình key-logger vẫn cần lấy bản sao của chương trình này từ máy tính của bạn. Sẽ mất cả hai phần để bẻ khóa mật khẩu của bạn
mật khẩu url. mã pyĐây là mã nguồn chính của chương trình này. Lưu ý rằng nó nhập hai mô-đun khác và tôi sẽ giải thích những mô-đun tiếp theo
import pyperclip
from prb import *url = pyperclip.paste[]
domain = url.split["/"][2].lower[]
key = input[f"{domain} .. Enter your key: "]
prb = Prb[domain + key]
a1 = "abcdefghijklmnopqrstuvwxyz"
a2 = a1.upper[]
a3 = "1234567890"
a4 = "!#$%*^&@~"
a5 = a1 + a2 + a3 + a4
pw = []
pw.append[a1[prb.next_byte[] % len[a1]]]
pw.append[a2[prb.next_byte[] % len[a2]]]
pw.append[a3[prb.next_byte[] % len[a3]]]
pw.append[a4[prb.next_byte[] % len[a4]]]
n = 0
while len[pw] < 17:
n += prb.next_byte[n]
n %= len[a5]
pw.insert[prb.next_byte[] % [len[pw] + 1], a5[n]]
pw = "".join[pw]
pyperclip.copy[pw]
Chuỗi URL được lấy từ khay nhớ tạm của hệ thống và tên miền được trích xuất trong một vài dòng đầu tiên
Bạn được nhắc nhập khóa của mình ở dòng tiếp theo và sự kết hợp giữa chuỗi miền và khóa của bạn được sử dụng để khởi tạo đối tượng Prb
[byte giả ngẫu nhiên]
Tất cả các ký tự mà bạn có thể muốn trong mật khẩu mới của mình được lưu trữ trong các chuỗi từ a1
đến
class Prb:0
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Nếu bạn muốn thêm hoặc xóa bất kỳ ký tự nào, vui lòng thực hiện tại đây. Danh sách
class Prb:1 được tạo bằng cách nối thêm một ký tự đầu tiên từ mỗi chuỗi đó. Điều này đảm bảo ít nhất một từ mỗi bộ
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Vòng lặp while sử dụng các byte giả ngẫu nhiên để chèn các ký tự bổ sung tại các vị trí ngẫu nhiên vào danh sách
class Prb:1, cho đến khi danh sách có 17 ký tự trong đó
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Vui lòng thay đổi
class Prb:3 thành bất kỳ độ dài mật khẩu nào, bạn có thể muốn. Cuối cùng, danh sách này được nối với nhau thành một chuỗi mật khẩu duy nhất và sau đó được đưa vào khay nhớ tạm của hệ thống sẵn sàng để bạn dán vàokẹp kim loại
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Lưu ý rằng mô-đun
class Prb:4 được nhập bởi chương trình này
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Một
class Prb:5 đơn giản và chỉ dùng một lần sẽ thêm thư viện này vào bản cài đặt Python của bạn
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Bạn có thể tìm hiểu thêm về
class Prb:4 tại trang Pypi của nó tại đây. Về cơ bản, điều này bổ sung khả năng lấy dữ liệu từ khay nhớ tạm của bạn và đưa dữ liệu trở lại vào đó. Tôi luôn sử dụng nó cho rất nhiều chương trình Python tiện ích
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Các byte giả ngẫu nhiên tốt như thế nào?
Lớp Prb
cũng được nhập trong mô-đun
class Prb:8. Đây là danh sách mã trước khi tôi giải thích nó
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
class Prb:
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Lớp này duy trì một danh sách, tên là
class Prb:9, gồm 256 số nguyên nằm trong khoảng từ 0 đến 255. Các biến
def __init__[self, seed]:
id = "JohnClarkCraig"
unique = "NbROtW62oDiJH9y0*p20F1Bj2*bQyj&IcA"
unique_seed = seed + id + unique
len_unique_seed = len[unique_seed]
self.p, self.q = 0, 0
self.buf = list[range[256]]
for i in range[9973]:
n = ord[unique_seed[i % len_unique_seed]]
self.next_byte[n + self.next_byte[]] def next_byte[self, b=0]:
self.p = [self.buf[self.p] + b + 1] % 256
self.q = [self.buf[self.q] + b + 2] % 256
self.buf[self.p], self.buf[self.q] =
self.buf[self.q], self.buf[self.p]
return self.p ^ self.q
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.0 và
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.1 là các chỉ mục trong danh sách này
Với mỗi cuộc gọi đến
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.2, các chỉ mục và thứ tự của các mục trong danh sách được chọn ngẫu nhiên dựa trên số nguyên được truyền tùy chọn
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.3
Thay đổi dù chỉ một bit của số b được truyền vào phương thức này và chuỗi byte đầu ra được thay đổi hoàn toàn về sau
Tùy chỉnh cho bạn và bạn một mìnhNhớ lại rằng chuỗi gốc được sử dụng để khởi tạo trình tạo byte giả ngẫu nhiên này được truyền từ chương trình chính — và nó chứa miền hiện tại và khóa của bạn
Điều này được kết hợp với chuỗi
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.4 được hiển thị ở trên, chuỗi này xác định rõ ràng bạn là duy nhất và một tập hợp bất kỳ ký tự ít nhiều ngẫu nhiên nào khác mà bạn muốn đưa vào thông qua chuỗi có tên duy nhất
Chuỗi kết hợp dài này sau đó được đưa vào phương thức
Want to Connect?John’s passion and mission are sharing Python code to help demystify life’s challenges and to have fun. John is the author of Python for Numworks , Python for OpenSCAD, Python for the TI-Nspire CX II, Python for the TI-84 Plus CE Python calculator , and many other titles.2, lặp đi lặp lại, để khởi tạo trình tạo thành một trạng thái hoàn toàn duy nhất. [có nhiều trạng thái độc đáo hơn số electron trong vũ trụ đã biết. Cho đến nay. ]
Bên cạnh đó, tôi đã gửi mã Prb
cho một số chuyên gia và họ đã nói rằng nó rất tốt
Ngoài ra, nó đã vượt qua với màu sắc bay bổng sau rất nhiều thử nghiệm rộng rãi bằng cách sử dụng các chương trình thử nghiệm byte giả ngẫu nhiên nổi tiếng khác nhau. Tất nhiên, nó không phải là một thuật toán mã hóa được chứng nhận chuyên nghiệp, nhưng để bảo vệ bằng mật khẩu cá nhân, nó hoạt động cực kỳ hiệu quả và bạn có thể tin tưởng rằng nó không có bất kỳ cửa hậu hay mã bí ẩn nào.
Mật khẩu được tạo bởi chương trình này có khả năng chống lại các cuộc tấn công vũ phu cao. Một tin tặc sẽ cần nắm giữ bản sao chương trình duy nhất của bạn, sau đó dùng vũ lực thông qua tất cả các phím tắt có thể mà bạn có thể chọn
Về mặt lý thuyết, điều đó có thể xảy ra, nhưng hãy so sánh khả năng xảy ra điều đó với các cuộc tấn công vào mật khẩu của bạn thông qua trình ghi khóa, các cuộc tấn công của chương trình quản lý mật khẩu trực tuyến hoặc các diễn biến bất chính khác mà bạn không có nhiều quyền kiểm soát
Tôi khuyên bạn nên tùy chỉnh bản sao của chương trình này bằng cách thay đổi các chuỗi được hiển thị trong lớp Prb
, sau đó không thay đổi chúng lần nữa. Bất kỳ thay đổi nhỏ nào cũng sẽ khiến tất cả mật khẩu của bạn khác đi. Lưu một bản sao giấy của chương trình của bạn ở một nơi an toàn, chỉ trong trường hợp bạn cần khôi phục nó vì bất kỳ lý do gì