การซ่อนรหัสผ่านในสคริปต์ python (การทำให้สับสนไม่ปลอดภัยเท่านั้น)


128

ฉันมีสคริปต์ python ซึ่งกำลังสร้างการเชื่อมต่อ ODBC การเชื่อมต่อ ODBC ถูกสร้างขึ้นด้วยสตริงการเชื่อมต่อ ในสตริงการเชื่อมต่อนี้ฉันต้องใส่ชื่อผู้ใช้และรหัสผ่านสำหรับการเชื่อมต่อนี้

มีวิธีง่ายๆในการปิดบังรหัสผ่านนี้ในไฟล์หรือไม่ (เพียงแค่ว่าไม่มีใครสามารถอ่านรหัสผ่านได้เมื่อฉันแก้ไขไฟล์)


16
เพียงจำไว้ว่าอย่างน้อยผู้ใช้ที่เรียกใช้ไฟล์นี้จะมีสิทธิ์ในการอ่านและสามารถคว้ารหัสผ่านได้อย่างง่ายดาย หากคุณเท่านั้นที่สามารถอ่านบางส่วนได้และคุณกังวลเกี่ยวกับคนที่มองข้ามไหล่ของคุณไป แต่ขอเตือนในขณะที่ผู้สังเกตการณ์ทั่วไปไม่สามารถจดจำสิ่งต่าง ๆ ได้เร็วพอที่จะคว้ารหัสผ่านใครก็ตามที่สามารถเข้าถึงสคริปต์และ ความรู้ทางเทคนิคเล็กน้อยและความทะเยอทะยานเพียงเล็กน้อยจะสามารถคว้ารหัสผ่านของคุณได้ คิดเสมอว่าการรักษาความปลอดภัยอย่างรอบคอบเป็นสิ่งสำคัญ
Youarefunny

คำตอบ:


117

การเข้ารหัส Base64อยู่ในไลบรารีมาตรฐานและจะหยุดยั้งนักเล่นไหล่:

>>> import base64
>>>  print(base64.b64encode("password".encode("utf-8")))
cGFzc3dvcmQ=
>>> print(base64.b64decode("cGFzc3dvcmQ=").decode("utf-8"))
password

5
ฉันเห็นด้วย. รหัสผ่านที่เข้ารหัส base64 ดูลึกลับกว่ามาก
Ed Haber

4
แต่ไม่ได้ช่วยให้ผู้ใช้รันสคริปต์ต้องอ่านได้และรหัสผ่านต้องไม่
Martin Beckett

79
ฉันไม่คิดว่าbase64จะทำให้สับสนได้ดีไปกว่าrot13ในบริบทนี้ ในทางตรงกันข้ามbase64มีลักษณะทั่วไป (เครื่องหมายเท่ากับ, ... ) และตรวจจับได้ง่ายกว่าวิธีอื่น ๆ ความสับสนใด ๆ ไม่มีประโยชน์ในทางปฏิบัติ แย่จริงๆที่คำตอบนี้ได้รับคะแนนสูง มันให้ความรู้สึกปลอดภัยอย่างผิด ๆ ...
schlamar

12
หากคุณกำลังบันทึกรหัสผ่านเพื่อให้สคริปต์ใช้งานได้ทุกคนที่มีสิทธิ์เข้าถึงสคริปต์จะสามารถรับรหัสผ่านได้ไม่ว่าคุณจะใช้วิธีการเข้ารหัสแบบใด ข้อกำหนดที่นี่เป็นเพียงการซ่อนรหัสผ่านจากคนที่ดูสคริปต์ในขณะที่เปิดอยู่ ในกรณีbase64นี้ดีกว่าrot13เนื่องจากอยู่ในไลบรารีมาตรฐาน Python
Dave Webb

17
base64 ไม่ใช่การเข้ารหัส มันทำให้สับสนที่สุด
csgeek

52

Douglas F Shearer เป็นโซลูชันที่ได้รับการรับรองโดยทั่วไปใน Unix เมื่อคุณต้องการระบุรหัสผ่านสำหรับการเข้าสู่ระบบระยะไกล
คุณเพิ่มตัวเลือก- รหัสผ่านจากไฟล์เพื่อระบุเส้นทางและอ่านข้อความธรรมดาจากไฟล์
จากนั้นไฟล์จะอยู่ในพื้นที่ของผู้ใช้เองที่ระบบปฏิบัติการป้องกันไว้ นอกจากนี้ยังช่วยให้ผู้ใช้ที่แตกต่างกันสามารถเลือกไฟล์ของตนเองโดยอัตโนมัติ

สำหรับรหัสผ่านที่ผู้ใช้สคริปต์ไม่ได้รับอนุญาตให้รู้คุณสามารถเรียกใช้สคริปต์โดยได้รับอนุญาตอย่างละเอียดและมีไฟล์รหัสผ่านที่เป็นของผู้ใช้ root / admin นั้น


1
คุณรันสคริปต์ด้วยสิทธิ์ที่ยกระดับโดยไม่ให้รหัสผ่านรูทหรือผู้ดูแลระบบได้อย่างไร เกี่ยวข้องกับการตั้งค่าบิต UID หรือไม่
Youarefunny

4
ไม่เป็นไรฉันคิดออกแล้ว สำหรับใครก็ตามที่สนใจ: หากสคริปต์มีบิต setuid ที่กำหนดระบบปฏิบัติการจะ'ส่ง'บิต setuid ไปยังล่าม น่าเสียดายที่มีช่องโหว่ด้านความปลอดภัยขนาดใหญ่ดังนั้น distros ที่ทันสมัยส่วนใหญ่จึงปิด setuid สำหรับสคริปต์
Youarefunny

ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับตัวเลือก - รหัสผ่านจากไฟล์ คุณมีตัวอย่างหรือไม่? ขอบคุณ!
pyramidface

@pyramidface - ฉันหมายความว่าคุณจะเขียนโค้ดคุณลักษณะเช่นนี้และเพิ่มความสามารถในการอ่าน passwd จากไฟล์
Martin Beckett

@MartinBeckett แต่อย่างที่คุณ Youarefunny บอกคุณจะต้องเพิ่ม setuid บน python เพื่อให้สคริปต์รูทเข้าถึงไฟล์รหัสผ่านหรือไม่?
pyramidface

51

นี่คือวิธีการง่ายๆ:

  1. สร้างโมดูล python - เรียกว่า peekaboo.py
  2. ใน peekaboo.py ให้ใส่ทั้งรหัสผ่านและรหัสที่ต้องใช้รหัสผ่านนั้น
  3. สร้างเวอร์ชันคอมไพล์ - peekaboo.pyc - โดยการนำเข้าโมดูลนี้ (ผ่าน python commandline ฯลฯ ... )
  4. ตอนนี้ลบ peekaboo.py
  5. ตอนนี้คุณสามารถนำเข้าจ๊ะเอ๋ได้อย่างมีความสุขโดยอาศัยเพียง peekaboo.pyc เนื่องจาก peekaboo.pyc คอมไพล์เป็นไบต์จึงไม่สามารถอ่านได้สำหรับผู้ใช้ทั่วไป

สิ่งนี้ควรจะปลอดภัยกว่าการถอดรหัส base64 เล็กน้อยแม้ว่าจะเสี่ยงต่อการถอดรหัส py_to_pyc ก็ตาม


2
สิ่งนี้ยังมีข้อบกพร่องอยู่ แต่จริงๆแล้วมันใกล้เคียงกับที่ฉันต้องการมาก มันจะช่วยให้ฉันสาธิตสคริปต์ python ที่มีการเชื่อมต่อผู้ใช้ / passwd โดยไม่ต้องเปิดเผยรหัสผ่านบนหน้าจอหรือต้องพิมพ์ลงในพรอมต์คำสั่ง หลังจากนำเข้า peekaboo import peekaboแล้วจะมีรหัสผ่านเป็นpeekaboo.password(หากมี peekaboo.py password='secret')
Dannid

8
หากคุณต้องการนำแนวคิดนี้ไปอีกขั้นคุณสามารถใช้Cythonเพื่อรวบรวมไฟล์. py ลงใน C และสร้างไบนารีเฉพาะแพลตฟอร์ม (เช่น .pyd สำหรับ windows, .so สำหรับ macOS ฯลฯ ) ... ตามcythonizingสคริปต์ของคุณ และการแบ่งปันไบนารีที่สร้างขึ้นคุณจะได้รับประโยชน์จากคำตอบนี้ + เพิ่มความสับสนอีกชั้นหนึ่งเพราะตอนนี้คุณได้ถอดรหัสรหัส C เพื่อเข้าสู่รหัสผ่าน สิ่งนี้ไม่ปลอดภัย 100% แต่ต้องใช้แรงงานจำนวนมากในการเข้าถึงข้อมูลที่ละเอียดอ่อนที่คุณต้องการซ่อน
Fnord

cythonizing สมบูรณ์แบบ
Arno

29

หากคุณกำลังทำงานบนระบบ Unix ให้ใช้ประโยชน์จากโมดูล netrc ในไลบรารี Python มาตรฐาน มันอ่านรหัสผ่านจากแยกไฟล์ข้อความ (.netrc) ซึ่งมีรูปแบบที่อธิบายที่นี่

นี่คือตัวอย่างการใช้งานเล็กน้อย:

import netrc

# Define which host in the .netrc file to use
HOST = 'mailcluster.loopia.se'

# Read from the .netrc file in your home directory
secrets = netrc.netrc()
username, account, password = secrets.authenticators( HOST )

print username, password

19

ทางออกที่ดีที่สุดสมมติว่าผู้ใช้ไม่สามารถกำหนดชื่อผู้ใช้และรหัสผ่านขณะรันไทม์ได้น่าจะเป็นซอร์สไฟล์แยกต่างหากที่มีการกำหนดค่าเริ่มต้นตัวแปรสำหรับชื่อผู้ใช้และรหัสผ่านที่นำเข้าสู่รหัสหลักของคุณ ไฟล์นี้จะต้องแก้ไขเมื่อข้อมูลรับรองเปลี่ยนไปเท่านั้น มิฉะนั้นหากคุณกังวลเกี่ยวกับนักเล่นไหล่ที่มีความทรงจำโดยเฉลี่ยการเข้ารหัส 64 ฐานอาจเป็นทางออกที่ง่ายที่สุด ROT13 นั้นง่ายเกินไปที่จะถอดรหัสด้วยตนเองไม่คำนึงถึงขนาดตัวพิมพ์และยังคงความหมายไว้มากเกินไปในสถานะเข้ารหัส เข้ารหัสรหัสผ่านและรหัสผู้ใช้ของคุณนอกสคริปต์ python ให้เขาถอดรหัสสคริปต์ที่รันไทม์เพื่อใช้งาน

การให้ข้อมูลรับรองสคริปต์สำหรับงานอัตโนมัติเป็นข้อเสนอที่มีความเสี่ยงเสมอ สคริปต์ของคุณควรมีข้อมูลประจำตัวของตัวเองและบัญชีที่ใช้ไม่ควรมีสิทธิ์เข้าถึงนอกเหนือจากสิ่งที่จำเป็น อย่างน้อยรหัสผ่านควรยาวและค่อนข้างสุ่ม


คำตอบที่ดีมาก - ขอบคุณ สำหรับสคริปต์ขนาดเล็กที่ฉันกำลังเขียน (ซึ่งเป็นสคริปต์การบำรุงรักษาอยู่ดี - การเข้ารหัส BASE64 ก็เพียงพอแล้ว)
bernhardrusch

2
ฟังดูดี แต่คุณสามารถยกตัวอย่างการนำไปใช้งานได้หรือไม่? ตอนนี้เป็นเพียงคำอธิบายของการปฏิบัติทั่วไปและไม่เป็นประโยชน์สำหรับคนที่ไม่เคยทำมาก่อน
Dannid

18

วิธีการนำเข้าชื่อผู้ใช้และรหัสผ่านจากไฟล์ภายนอกไปยังสคริปต์ ด้วยวิธีนี้แม้ว่าจะมีคนถือสคริปต์ แต่ก็จะไม่ได้รับรหัสผ่านโดยอัตโนมัติ


15

base64 คือหนทางที่จะตอบสนองความต้องการง่ายๆของคุณ ไม่จำเป็นต้องนำเข้าสิ่งใด:

>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'

2
โง่อะไรกันแน่! การตอบกลับทั้งหมดหรือส่วนที่ไม่ได้นำเข้า?
tzot

18
Base64 เพิ่มภาพลวงตาของความปลอดภัยเท่านั้น
FlySwat

13
โจนาธานดูเหมือนว่าคุณไม่ได้อ่านคำถาม มันเกี่ยวกับความคลุมเครือ (และชั่วคราวมาก) ไม่ใช่ความปลอดภัยดังนั้นฉันไม่เข้าใจว่าทำไมคุณถึงคิดว่าคำตอบของฉันไม่เป็นประโยชน์
tzot

1
ฉันไม่รู้ว่าคุณสามารถทำได้แทนที่จะต้องใช้โมดูล base64 และมีการเข้ารหัสจำนวนมากเช่น zlib ด้วย ... สนุก :)
Kiv

1
@ เดนนิสการใช้โมดูล base64 เป็นวิธีที่ต้องการในปัจจุบัน หลังใช้งานไม่ได้อีกต่อไปใน Python เวอร์ชันใหม่กว่า
Jeyekomon

5

สำหรับpython3 obfuscation โดยใช้base64นั้นแตกต่างกัน:

import base64
base64.b64encode(b'PasswordStringAsStreamOfBytes')

ซึ่งส่งผลให้

b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM='

สังเกตการแสดงสตริงแบบไม่เป็นทางการสตริงจริงอยู่ในเครื่องหมายคำพูด

และถอดรหัสกลับเป็นสตริงเดิม

base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
b'PasswordStringAsStreamOfBytes'

เพื่อใช้ผลลัพธ์นี้ในกรณีที่ต้องใช้สตริงอ็อบเจ็กต์สามารถแปลอ็อบเจ็กต์ไบต์ได้

repr = base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
secret = repr.decode('utf-8')
print(secret)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจับ python3 ไบต์ (และสตริงตาม) โปรดดูเอกสารอย่างเป็นทางการ


4

นี่เป็นปัญหาที่พบบ่อย โดยทั่วไปแล้วสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือทำอย่างใดอย่างหนึ่ง

A) สร้างฟังก์ชันการเข้ารหัสซีซาร์เพื่อเข้ารหัส / ถอดรหัส (ไม่ใช่ rot13) หรือ

B) วิธีการที่ต้องการคือการใช้คีย์เข้ารหัสซึ่งอยู่ใกล้กับโปรแกรมของคุณเข้ารหัส / ถอดรหัสรหัสผ่าน ซึ่งคุณสามารถใช้การป้องกันไฟล์เพื่อป้องกันการเข้าถึงคีย์

ตามบรรทัดเหล่านี้หากแอปของคุณทำงานเป็นบริการ / daemon (เช่นเว็บเซิร์ฟเวอร์) คุณสามารถใส่คีย์ของคุณลงในที่เก็บคีย์ที่มีการป้องกันด้วยรหัสผ่านโดยใส่รหัสผ่านเป็นส่วนหนึ่งของการเริ่มต้นบริการ ผู้ดูแลระบบจะต้องรีสตาร์ทแอปของคุณ แต่คุณจะมีการตรวจสอบรหัสผ่านการกำหนดค่าที่ดีมาก


2

ระบบปฏิบัติการของคุณอาจมีสิ่งอำนวยความสะดวกสำหรับการเข้ารหัสข้อมูลอย่างปลอดภัย ตัวอย่างเช่นบน Windows มี DPAPI (data protection API) ทำไมไม่ขอข้อมูลรับรองจากผู้ใช้ในครั้งแรกที่คุณเรียกใช้แล้วกระรอกพวกเขาออกไปโดยเข้ารหัสสำหรับการเรียกใช้ในภายหลัง


2

การประเมินแบบพื้นบ้านมากกว่าการแปลงการรับรองความถูกต้อง / รหัสผ่าน / ชื่อผู้ใช้เป็นรายละเอียดที่เข้ารหัส FTPLIBเป็นเพียงตัวอย่าง " pass.csv " คือชื่อไฟล์ csv

บันทึกรหัสผ่านใน CSV ดังต่อไปนี้:

user_name

user_password

(ไม่มีส่วนหัวของคอลัมน์)

การอ่าน CSV และบันทึกลงในรายการ

ใช้องค์ประกอบรายการเป็นรายละเอียดการพิสูจน์ตัวตน

รหัสเต็ม

import os
import ftplib
import csv 
cred_detail = []
os.chdir("Folder where the csv file is stored")
for row in csv.reader(open("pass.csv","rb")):       
        cred_detail.append(row)
ftp = ftplib.FTP('server_name',cred_detail[0][0],cred_detail[1][0])

2

นี่คือตัวอย่างของฉันสำหรับสิ่งนั้น โดยพื้นฐานแล้วคุณจะนำเข้าหรือคัดลอกฟังก์ชันไปยังรหัสของคุณ getCredentials จะสร้างไฟล์ที่เข้ารหัสหากไม่มีอยู่และส่งคืน dictionaty และ updateCredential จะอัปเดต

import os

def getCredentials():
    import base64

    splitter='<PC+,DFS/-SHQ.R'
    directory='C:\\PCT'

    if not os.path.exists(directory):
        os.makedirs(directory)

    try:
        with open(directory+'\\Credentials.txt', 'r') as file:
            cred = file.read()
            file.close()
    except:
        print('I could not file the credentials file. \nSo I dont keep asking you for your email and password everytime you run me, I will be saving an encrypted file at {}.\n'.format(directory))

        lanid = base64.b64encode(bytes(input('   LanID: '), encoding='utf-8')).decode('utf-8')  
        email = base64.b64encode(bytes(input('   eMail: '), encoding='utf-8')).decode('utf-8')
        password = base64.b64encode(bytes(input('   PassW: '), encoding='utf-8')).decode('utf-8')
        cred = lanid+splitter+email+splitter+password
        with open(directory+'\\Credentials.txt','w+') as file:
            file.write(cred)
            file.close()

    return {'lanid':base64.b64decode(bytes(cred.split(splitter)[0], encoding='utf-8')).decode('utf-8'),
            'email':base64.b64decode(bytes(cred.split(splitter)[1], encoding='utf-8')).decode('utf-8'),
            'password':base64.b64decode(bytes(cred.split(splitter)[2], encoding='utf-8')).decode('utf-8')}

def updateCredentials():
    import base64

    splitter='<PC+,DFS/-SHQ.R'
    directory='C:\\PCT'

    if not os.path.exists(directory):
        os.makedirs(directory)

    print('I will be saving an encrypted file at {}.\n'.format(directory))

    lanid = base64.b64encode(bytes(input('   LanID: '), encoding='utf-8')).decode('utf-8')  
    email = base64.b64encode(bytes(input('   eMail: '), encoding='utf-8')).decode('utf-8')
    password = base64.b64encode(bytes(input('   PassW: '), encoding='utf-8')).decode('utf-8')
    cred = lanid+splitter+email+splitter+password
    with open(directory+'\\Credentials.txt','w+') as file:
        file.write(cred)
        file.close()

cred = getCredentials()

updateCredentials()

1

วางข้อมูลการกำหนดค่าในไฟล์กำหนดค่าที่เข้ารหัส ค้นหาข้อมูลนี้ในรหัสของคุณโดยใช้คีย์ วางคีย์นี้ไว้ในไฟล์แยกกันตามสภาพแวดล้อมและอย่าเก็บไว้ด้วยรหัสของคุณ


1

คุณรู้จักพิทไหม?

https://pypi.python.org/pypi/pit (เฉพาะ py2 (เวอร์ชัน 0.3))

https://github.com/yoshiori/pit (จะทำงานบน py3 (เวอร์ชันปัจจุบัน 0.4))

test.py

from pit import Pit

config = Pit.get('section-name', {'require': {
    'username': 'DEFAULT STRING',
    'password': 'DEFAULT STRING',
    }})
print(config)

วิ่ง:

$ python test.py
{'password': 'my-password', 'username': 'my-name'}

~ / .pit / default.yml:

section-name:
  password: my-password
  username: my-name

3
Pit ไม่มีเอกสารใด ๆ
successhawk

ตามที่ @successhawk ได้ระบุไว้ - ฉันไม่เห็นเอกสารใด ๆ ในลิงก์ github / pypi สำหรับ "pit" - แต่คำอธิบายข้างต้นนั้นชัดเจน - และโดยรวมแล้วฉันชอบโซลูชันนี้สำหรับ "การซ่อน" ข้อมูลรับรองจากมุมมองที่ง่าย ...
netdesignate

ฉันลังเลที่จะใช้โมดูลที่ไม่ได้รับการบำรุงรักษาและฉันได้รับข้อผิดพลาดเมื่อพยายามใช้ตามคำแนะนำ:/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
netdesignate

1

หากทำงานบน Windows คุณสามารถพิจารณาใช้ไลบรารี win32crypt อนุญาตให้จัดเก็บและเรียกข้อมูลที่มีการป้องกัน (คีย์รหัสผ่าน) โดยผู้ใช้ที่กำลังเรียกใช้สคริปต์ดังนั้นรหัสผ่านจะไม่ถูกจัดเก็บในข้อความที่ชัดเจนหรือรูปแบบที่ซับซ้อนในรหัสของคุณ ฉันไม่แน่ใจว่ามีการใช้งานที่เทียบเท่ากับแพลตฟอร์มอื่นหรือไม่ดังนั้นด้วยการใช้ win32crypt อย่างเข้มงวดรหัสของคุณจึงไม่สามารถพกพาได้

ฉันเชื่อว่าโมดูลสามารถรับได้ที่นี่: http://timgolden.me.uk/pywin32-docs/win32crypt.html


1

วิธีที่ฉันได้ทำมีดังนี้:

ที่งูหลามเชลล์:

>>> from cryptography.fernet import Fernet
>>> key = Fernet.generate_key()
>>> print(key)
b'B8XBLJDiroM3N2nCBuUlzPL06AmfV4XkPJ5OKsPZbC4='
>>> cipher = Fernet(key)
>>> password = "thepassword".encode('utf-8')
>>> token = cipher.encrypt(password)
>>> print(token)
b'gAAAAABe_TUP82q1zMR9SZw1LpawRLHjgNLdUOmW31RApwASzeo4qWSZ52ZBYpSrb1kUeXNFoX0tyhe7kWuudNs2Iy7vUwaY7Q=='

จากนั้นสร้างโมดูลด้วยรหัสต่อไปนี้:

from cryptography.fernet import Fernet

# you store the key and the token
key = b'B8XBLJDiroM3N2nCBuUlzPL06AmfV4XkPJ5OKsPZbC4='
token = b'gAAAAABe_TUP82q1zMR9SZw1LpawRLHjgNLdUOmW31RApwASzeo4qWSZ52ZBYpSrb1kUeXNFoX0tyhe7kWuudNs2Iy7vUwaY7Q=='

# create a cipher and decrypt when you need your password
cipher = Fernet(key)

mypassword = cipher.decrypt(token).decode('utf-8')

เมื่อคุณทำเสร็จแล้วคุณสามารถนำเข้า mypassword โดยตรงหรือนำเข้าโทเค็นและรหัสเพื่อถอดรหัสได้ตามต้องการ

เห็นได้ชัดว่าแนวทางนี้มีข้อบกพร่องบางประการ หากมีคนมีทั้งโทเค็นและคีย์ (เช่นเดียวกับที่มีสคริปต์) พวกเขาสามารถถอดรหัสได้อย่างง่ายดาย อย่างไรก็ตามมันทำให้สับสนและหากคุณรวบรวมรหัส (ที่มีบางอย่างเช่น Nuitka) อย่างน้อยรหัสผ่านของคุณจะไม่ปรากฏเป็นข้อความธรรมดาในโปรแกรมแก้ไขเลขฐานสิบหก


0

สิ่งนี้ไม่ได้ตอบคำถามของคุณอย่างแม่นยำ แต่เกี่ยวข้องกัน ฉันกำลังจะเพิ่มเป็นความคิดเห็น แต่ไม่ได้รับอนุญาต ฉันได้จัดการกับปัญหาเดียวกันนี้แล้วและเราได้ตัดสินใจที่จะเปิดเผยสคริปต์ให้กับผู้ใช้ที่ใช้เจนกินส์ สิ่งนี้ช่วยให้เราจัดเก็บข้อมูลรับรองฐานข้อมูลในไฟล์แยกต่างหากที่เข้ารหัสและรักษาความปลอดภัยบนเซิร์ฟเวอร์และไม่สามารถเข้าถึงได้โดยผู้ที่ไม่ใช่ผู้ดูแลระบบ นอกจากนี้ยังช่วยให้เรามีทางลัดเล็กน้อยในการสร้าง UI และการควบคุมการดำเนินการ


0

คุณยังสามารถพิจารณาความเป็นไปได้ในการจัดเก็บรหัสผ่านนอกสคริปต์และการจัดเก็บรหัสผ่านขณะรันไทม์

เช่น fred.py

import os
username = 'fred'
password = os.environ.get('PASSWORD', '')
print(username, password)

ซึ่งสามารถเรียกใช้เช่น

$ PASSWORD=password123 python fred.py
fred password123

"การรักษาความปลอดภัยผ่านความสับสน" เพิ่มเติมสามารถทำได้โดยใช้ base64 (ตามที่แนะนำข้างต้น) โดยใช้ชื่อที่ไม่ชัดเจนในรหัสและทำให้รหัสผ่านจริงห่างไกลจากรหัสมากขึ้น

หากรหัสอยู่ในที่เก็บมักมีประโยชน์ในการจัดเก็บความลับภายนอกดังนั้นจึงสามารถเพิ่มสิ่งนี้ลงใน~/.bashrc(หรือในห้องนิรภัยหรือสคริปต์เรียกใช้งาน ... )

export SURNAME=cGFzc3dvcmQxMjM=

และเปลี่ยนfred.pyเป็น

import os
import base64
name = 'fred'
surname = base64.b64decode(os.environ.get('SURNAME', '')).decode('utf-8')
print(name, surname)

จากนั้นเข้าสู่ระบบอีกครั้งและ

$ python fred.py
fred password123

0

ทำไมไม่มี xor ง่ายๆ?

ข้อดี:

  • ดูเหมือนข้อมูลไบนารี
  • ไม่มีใครสามารถอ่านได้โดยไม่ต้องรู้คีย์ (แม้ว่าจะเป็นถ่านตัวเดียวก็ตาม)

ฉันมาถึงจุดที่ฉันจำสตริง b64 ง่ายๆสำหรับคำทั่วไปและ rot13 ได้เช่นกัน Xor จะทำให้ยากขึ้นมาก


0
import base64
print(base64.b64encode("password".encode("utf-8")))
print(base64.b64decode(b'cGFzc3dvcmQ='.decode("utf-8")))

นี่คือวิธีการแก้ปัญหาจากการที่คำตอบที่ได้รับการยอมรับ
Sergey Shubin

-1

มียูทิลิตี้ ROT13 หลายรายการที่เขียนด้วย Python บน 'Net - เพียงแค่ Google สำหรับพวกเขา ROT13 เข้ารหัสสตริงแบบออฟไลน์คัดลอกลงในแหล่งที่มาถอดรหัสที่จุดส่ง

แต่นี่คือการป้องกันที่อ่อนแอจริงๆ ...


โปรดใส่ลิงก์หรือโค้ดตัวอย่างเพื่อให้คำตอบนี้มีประโยชน์มากขึ้น
Micah Stubbs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.