代碼中的敏感信息加密方案


曾有個同事不小心把項目代碼給傳到了Github上,導致代碼里邊的一個明文郵箱賬號密碼被利用,為此公司及個人都付出了沉重的代價。那么代碼中的敏感信息該如何處理呢?本文將簡單介紹一下我們的實踐方法。

實現目標

  1. 代碼中的敏感信息加密,例如郵箱賬號密碼、連接數據庫的賬號密碼、第三方校驗的key
  2. 對於生產使用的原始密碼等信息應盡量少的人接觸,例如數據庫的密碼應只有DBA知道

信息加密

信息加密常見的有兩類:

第一類無需解密:例如系統登錄密碼加密,通過加密算法對用戶輸入密碼進行加密后存放在數據庫中,用戶再次登錄時依然拿相同的加密算法對用戶輸入密碼進行加密,拿加密后的結果和數據庫中存放的結果做對比,整個過程中都不需要知道用戶輸入的原始密碼是什么,MD5是處理此類加密最常用的加密算法

第二類需要解密:例如我們寫在項目代碼中連接數據庫的賬號密碼,項目代碼中以密文方式存儲,當需要連接數據庫的時候,要對密文進行解密,拿到原始未加密的賬號密碼去連接數據庫,與MD5單向加密不同,這類加密需要能對加密后的密文進行解密,此類加密方法目前最常用的加密算法為RSA

我們這里考慮的是給配置文件里的敏感信息加密,也就是上邊說的第二類情況,采用的也是RSA加密算法,關於RSA加密算法的詳細內容自行Google下吧,這里不贅述,需要知道以下兩點就可以了:

  1. 加密算法需要生成一對RSA秘鑰,分別為公鑰和私鑰
  2. 拿公鑰對密碼進行加密得到加密后的字符串配置在項目代碼中,需要使用原始密碼的時候拿私鑰對加密后的字符串進行解密得到原始密碼

這里注意一個問題,拿到私鑰就可以對加密字符串進行解密,那么這個秘鑰肯定就不能放在項目代碼中了,不然再遇到代碼給傳Github的情況就可以拿秘鑰進行解密,失去了加密的意義了。這里我們的策略是秘鑰統一由運維管理,直接放在生產服務器中,項目代理里配置路徑可讀取秘鑰即可,避免秘鑰因代碼泄露而泄露。

RSA加解密python腳本,可以直接使用此腳本生成RSA秘鑰對,加密密碼或者解密,當然也可以使用OpenSSL工具完成此操作

import binascii
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5


class RsaCrypto():
    '''RSA 加解密'''

    def create_rsa_key(self):
        '''生成RSA秘鑰對'''
        try:
            key = RSA.generate(2048)
            encrypted_key = key.exportKey(pkcs=8)

            public_key = key.publickey().exportKey().decode('utf-8')
            private_key = encrypted_key.decode('utf-8')

            return {'state': 1, 'message': {'public_key': public_key, 'private_key': private_key}}
        except Exception as err:
            return {'state': 0, 'message': str(err)}

    def encrypt(self, public_key, plaintext):
        '''加密方法'''
        try:
            recipient_key = RSA.import_key(public_key)
            cipher_rsa = PKCS1_v1_5.new(recipient_key)

            en_data = cipher_rsa.encrypt(plaintext.encode('utf-8'))
            hex_data = binascii.hexlify(en_data).decode('utf-8')

            return {'state': 1, 'message': hex_data}
        except Exception as err:
            return {'state': 0, 'message': str(err)}

    def decrypt(self, private_key, hex_data):
        '''解密方法'''
        try:
            private_key = RSA.import_key(private_key)
            cipher_rsa = PKCS1_v1_5.new(private_key)

            en_data = binascii.unhexlify(hex_data.encode('utf-8'))
            data = cipher_rsa.decrypt(en_data, None).decode('utf-8')

            return {'state': 1, 'message': data}
        except Exception as err:
            return {'state': 0, 'message': str(err)}


if __name__ == '__main__':
    print(RsaCrypto().create_rsa_key())

流程管控

以數據庫的密碼管理為樣例來介紹下我們的流程

  1. 運維通過加密系統生成RSA秘鑰對,並將秘鑰對放在生產服務器上,通知開發秘鑰在服務器上的存放路徑,由開發寫在項目代碼配置文件中
  2. DBA創建數據庫賬號密碼,通過上一步運維生成的秘鑰對密碼進行加密,並將加密后的字符串給到開發寫在項目代碼配置文件中

文章未完,全部內容請關注公眾號【運維咖啡吧】或個人網站https://ops-coffee.cn查看,運維咖啡吧專注於原創精品內容分享,感謝您的支持

掃碼關注公眾號查看更多實用文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM