python實(shí)現(xiàn)對服務(wù)器腳本敏感信息的加密解密

背景

在實(shí)際項(xiàng)目實(shí)施中,會編寫很多在服務(wù)器執(zhí)行的作業(yè)腳本瓶佳。程序中凡是涉及到數(shù)據(jù)庫鏈接、操作系統(tǒng)用戶鏈接鳞青、IP地址霸饲、主機(jī)名稱的內(nèi)容都是敏感信息。在純內(nèi)網(wǎng)系統(tǒng)中往因?yàn)殚_發(fā)時間緊迫臂拓,往往都直接將這些敏感信息明文方式寫在腳本中了厚脉。
稍微規(guī)范一點(diǎn)的,創(chuàng)建一個通用的config文件胶惰,將所有這類敏感信息記錄在這個文件中傻工,腳本以讀取文件方式獲取這些信息。這種方式的好處是腳本不用在應(yīng)用遷移孵滞、災(zāi)備部署的時候再起不同的版本中捆,尤其是大數(shù)據(jù)平臺作業(yè)運(yùn)行的腳本,如果是需要做災(zāi)備集群坊饶,這種方式可以減少生產(chǎn)變更時的人工干預(yù)操作泄伪。但是這種方式仍不能解決安全性的問題,只要config文件泄露幼东,那么平臺會非常危險臂容。
因此在這個config文件的基礎(chǔ)上,對其進(jìn)行改造根蟹,實(shí)現(xiàn)對內(nèi)容的加密脓杉,而腳本使用時再對其進(jìn)行解密。因此要求有一個程序能對文本內(nèi)容進(jìn)行加密简逮,也能進(jìn)行反向解密球散。
不可逆的加密方法使用最多的就是md5加密算法,我們一般用來檢驗(yàn)文件的完整和安全性散庶,不適用這個場景蕉堰。
使用python語言對文本內(nèi)容進(jìn)行加解密有多種方式,從網(wǎng)上搜索結(jié)果看主要有以下幾種:

1.方法一 使用base64轉(zhuǎn)編碼

Base64是一種用64個字符來表示任意二進(jìn)制數(shù)據(jù)的方法悲龟。
用記事本打開exe屋讶、jpg、pdf這些文件時须教,我們都會看到一大堆亂碼皿渗,因?yàn)槎M(jìn)制文件包含很多無法顯示和打印的字符,所以轻腺,如果要讓記事本這樣的文本處理軟件能處理二進(jìn)制數(shù)據(jù)乐疆,就需要一個二進(jìn)制到字符串的轉(zhuǎn)換方法。Base64是一種最常見的二進(jìn)制編碼方法贬养。
Base64的原理很簡單挤土,首先,準(zhǔn)備一個包含64個字符的數(shù)組:
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
然后误算,對二進(jìn)制數(shù)據(jù)進(jìn)行處理仰美,每3個字節(jié)一組,一共是3x8=24bit儿礼,劃為4組筒占,每組正好6個bit,得到4個數(shù)字作為索引,然后查表蜘犁,獲得相應(yīng)的4個字符翰苫,就是編碼后的字符串。
所以这橙,Base64編碼會把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù)奏窑,長度增加33%,好處是編碼后的文本數(shù)據(jù)可以在郵件正文屈扎、網(wǎng)頁等直接顯示埃唯。
如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會剩下1個或2個字節(jié)怎么辦鹰晨?
Base64用\x00字節(jié)在末尾補(bǔ)足后墨叛,再在編碼的末尾加上1個或2個=號止毕,表示補(bǔ)了多少字節(jié),解碼的時候漠趁,會自動去掉扁凛。

Python內(nèi)置的base64可以直接進(jìn)行base64的編解碼:

import base64
userPassword="sunlinemdp201810"
unkownPassword=base64.b64encode(bytes(userPassword,'utf-8'))
print("加密后:"+str(unkownPassword,'utf-8'))
kownPassword=str(base64.b64decode(unkownPassword),'utf-8')
print('解密后:'+kownPassword)

補(bǔ)充說明:python3中對字符串加解密的方法 base64.encodestring('test') 不能用 因此只能采用bytes方法然后中間進(jìn)行格式轉(zhuǎn)換

由于標(biāo)準(zhǔn)的Base64編碼后可能出現(xiàn)字符+和/,在URL中就不能直接作為參數(shù)闯传,所以又有一種"url urlsafe_b64encode"的base64編碼方法谨朝,實(shí)現(xiàn)對+和/的轉(zhuǎn)碼,在現(xiàn)在使用的版本中這個功能已經(jīng)整合在b64encode方法中了

userPassword="sunlinemdp201810"
unkownPassword=base64.b64encode(bytes(userPassword,'utf-8'))
print("加密后:"+str(unkownPassword,'utf-8'))
unkownPassword=base64.urlsafe_b64encode(bytes(userPassword,'utf-8'))
print("解密后:"+str(unkownPassword,'utf-8'))
base64.urlsafe_b64decode(unkownPassword)

2.方法二 win32com.client

樣例代碼如下:

import win32com.client
def encrypt(key,content): # key:密鑰,content:明文
    EncryptedData = win32com.client.Dispatch('CAPICOM.EncryptedData')
    EncryptedData.Algorithm.KeyLength = 5
    EncryptedData.Algorithm.Name = 2
    EncryptedData.SetSecret(key)
    EncryptedData.Content = content
    return EncryptedData.Encrypt()
def decrypt(key,content): # key:密鑰,content:密文
    EncryptedData = win32com.client.Dispatch('CAPICOM.EncryptedData')
    EncryptedData.Algorithm.KeyLength = 5
    EncryptedData.Algorithm.Name = 2
    EncryptedData.SetSecret(key)
    EncryptedData.Decrypt(content)
    str = EncryptedData.Content
    return str

s1 = encrypt('sunline', 'hello world')
s2 = decrypt('sunline', s1)
print s1,s2
 

win32com是python操作windows程序的第三方包甥绿,放在服務(wù)器上使用不太合適字币。

3.方法三 PyCrypto

一個極好的用于信息安全的python庫,包括所有主流算法共缕。
具體可以參考:
pycrypto調(diào)用方法

服務(wù)器文件加密實(shí)現(xiàn)

現(xiàn)在假定要對一個存儲各類ip洗出、賬戶、密碼的global.properties文件進(jìn)行加密图谷,同時共苛,支持在讀取時進(jìn)行解密。
global.properties的內(nèi)容假定如下圖所示:

bgp.inceptor.in1.ip=10.22.179.13
bgp.inceptor.in1.default=cmr
bgp.inceptor.in2.ip=10.22.179.14
bgp.inceptor.in2.default=default
bdp.ldap.mdp.username=mdp
bdp.ldap.mdp.password=mdp

每一行使用等號將信息分為兩段蜓萄,等號左邊是信息項(xiàng)名稱隅茎,等號右邊是信息項(xiàng)具體的內(nèi)容,我們要對信息項(xiàng)的具體的內(nèi)容進(jìn)行加密嫉沽。
首先做需求分析辟犀,我們的需求可以拆分為以下幾個:

  1. 實(shí)現(xiàn)對指定字符串內(nèi)容基于某個密鑰的加解密內(nèi)容輸出
  2. 讀取指定加密配置文件,根據(jù)信息項(xiàng)名稱讀取指定內(nèi)容后加解密輸出
  3. 讀取指定配置文件绸硕,對文件內(nèi)每一行信息項(xiàng)的具體內(nèi)容進(jìn)行加解密后生成新的加解密后的配置文件

第二步做程序設(shè)計堂竟,我是從功能上進(jìn)行拆分設(shè)計:
基本功能包括:

  1. 加密解密
  2. 獲取文件
  3. 文件指定內(nèi)容讀取

交互操作包括:

  1. 參數(shù)讀取解析
  2. 具體功能實(shí)現(xiàn),輸出結(jié)果或生成文件

輸入輸出設(shè)計:

  1. 輸入: 功能類型 -d 對應(yīng) 四種功能需求
  2. 輸入: 密鑰 -k 密鑰內(nèi)容
  3. 輸入: 加密內(nèi)容或解密內(nèi)容 -c 對應(yīng)功能2
  4. 輸入: 配置文件路徑名稱 -f 對應(yīng)功能 234
  5. 輸入: 信息項(xiàng)內(nèi)容 -i 對應(yīng)功能4
  6. 輸出: 加解密文 對應(yīng)功能 1 4
  7. 輸出: 文件路徑及名稱 對應(yīng)功能 2 3

第三步玻佩,首先根據(jù)他人提供的方法做了一個對具體字符串進(jìn)行加解密的類出嘹,唯一多做的處理就是對加密使用的密鑰多了一個base64編碼的過程,文件保存為optcrypt.py:

#coding: utf8
'''
實(shí)現(xiàn)對指定字符串內(nèi)容基于某個密鑰的加解密內(nèi)容輸出
密鑰使用base64多加一層處理

version: v0.0.1
author:  Duwj
date: 2018-10-24
'''

import sys
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import base64

class optcrypt():
    def __init__(self, key):
        self.key = str(base64.b64decode(key))
        self.mode = AES.MODE_CBC
        #self.iv = Random.new().read(AES.block_size)
    #加密函數(shù)咬崔,如果text不是16的倍數(shù)【加密文本text必須為16的倍數(shù)税稼!】,那就補(bǔ)足為16的倍數(shù)
    def aesencrypt(self, text):

        #密鑰key 長度必須為16(AES-128)垮斯、24(AES-192)郎仆、或32(AES-256)Bytes 長度.目前AES-128足夠用
        cipher = AES.new(self.key, self.mode, self.key)
        #cipher=AES.new(bytes(self.key), self.mode,Random.new().read(AES.block_size))

        #加密文本text必須為16的倍數(shù)
        add = 16 - (len(text) % 16)
        text = text + ('\0' * (16 - (len(text) % 16)))
        self.ciphertext = cipher.encrypt(text)
        #因?yàn)锳ES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題
        #所以這里統(tǒng)一把加密后的字符串轉(zhuǎn)化為16進(jìn)制字符串
        return b2a_hex(self.ciphertext)
     
    #解密   
    def aesdecrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.key)
        #16進(jìn)制轉(zhuǎn)回后解密
        plain_text = cryptor.decrypt(a2b_hex(text))

        #rstrip()去掉補(bǔ)的空格
        return plain_text.rstrip('\0')


if __name__ == '__main__':
    #設(shè)置環(huán)境編碼
    reload(sys)
    sys.setdefaultencoding('utf8')
    #測試
    pc = optcrypt('c3VubGluZW1kcDIwMTgxMQ==') 
    e = pc.aesencrypt("duwj") 
    d = pc.aesdecrypt("d518cdd30b854b84f5aa7c5511e03e38") 
    print "info:duwj,encrypt:"+e+",decrypt:"+d      

然后就是依托這個基礎(chǔ)的字符串加解密類兜蠕,實(shí)現(xiàn)對字符串扰肌、文件、信息項(xiàng)的加解密功能熊杨,在這個過程中沒有對復(fù)雜的properties結(jié)構(gòu)進(jìn)行解析曙旭,單純的使用=實(shí)現(xiàn)信息項(xiàng)和密文內(nèi)容的分離盗舰,文件保存為server.py:

#!bin/python
#-*- coding: UTF-8 -*-

'''
腳本功能:
         1. 實(shí)現(xiàn)對指定字符串內(nèi)容基于某個密鑰的加解密內(nèi)容輸出
         2. 讀取指定加密配置文件,根據(jù)信息項(xiàng)名稱讀取指定內(nèi)容后加解密輸出
         3. 讀取指定配置文件桂躏,對文件內(nèi)每一行信息項(xiàng)的具體內(nèi)容進(jìn)行加解密后生成新的加解密后的配置文件
使用說明:python server.py 
         -d [選擇方法[se 字符串加密 /sd 字符串解密/ie 信息項(xiàng)加密/id 信息項(xiàng)解密/fe 文件加密/fd 文件加密]]  
         -k [16位密鑰]
         -c [加密內(nèi)容]
         -f [文件名稱]
         -i [信息項(xiàng)名稱]
         字符串加解密必選項(xiàng): -k -c 
         信息項(xiàng)加解密必選項(xiàng): -k -f -i
         文件加解密必選項(xiàng):    -k -f 

version: v0.0.1
author:  Duwj
date: 2018-11-05
'''

import os
import sys
import getopt 
from optcrypt import optcrypt

#字符串加解密
def stringCrpyt(func_name,value):
    if func_name =="se":
        crpyt_value=pc.aesencrypt(value)
    else:
        crpyt_value=pc.aesdecrypt(value)
    return crpyt_value

#信息項(xiàng)加解密輸出
def infoCrpyt(func_name,file_name,info_name):
    value=""
    try:
        pro_file = open(file_name, 'Ur')
        for line in pro_file.readlines():
            line = line.strip().replace('\n', '')
            if info_name == line.split('=')[0]:
                value = line.split('=')[1]
                #print value 
    except Exception, e:
         raise e
    finally:
        pro_file.close()

    if func_name == "ie":
        crpyt_value=pc.aesencrypt(value)
    elif func_name=="id":
        crpyt_value=pc.aesdecrypt(value)
    return  crpyt_value 

#文件加解密
def fileCrpyt(func_name,file_name):
    try:
        read_file = open(file_name,'Ur')
        write_file = open(file_name+"."+func_name+"crypt",'w')
        if func_name == "fe":
            for line in read_file.readlines():
                line = line.strip().replace('\n', '')
                if line=="":
                    pass
                elif line.find("#")!=-1:
                    write_file.write(line+"\n")
                else:
                    strs=line.split('=')[0]+"="+pc.aesencrypt(line.split('=')[1])
                    write_file.write(strs+"\n")
        else:
            for line in read_file.readlines():
                line = line.strip().replace('\n', '')
                if line.find("#")!=-1:
                    write_file.write(line+"\n")
                else:
                    strs=line.split('=')[0]+"="+pc.aesdecrypt(line.split('=')[1])
                    write_file.write(strs+"\n")
    except Exception, e:
         raise e
    finally:
        read_file.close()
        write_file.close()
    return file_name+"."+func_name+"crypt"

if __name__ == "__main__":
    #設(shè)置環(huán)境編碼
    reload(sys)
    sys.setdefaultencoding('utf8')
    msg='''使用說明:python server.py 
         -d [選擇方法[se 字符串加密 /sd 字符串解密/ie 信息項(xiàng)加密/id 信息項(xiàng)解密/fe 文件加密/fd 文件加密]]  
         -k [16位密鑰]
         -c [加密內(nèi)容]
         -f [文件名稱]
         -i [信息項(xiàng)名稱]
         字符串加解密必選項(xiàng): -k -c 
         信息項(xiàng)加解密必選項(xiàng): -k -f -i
         文件加解密必選項(xiàng):    -k -f 
         '''        
    #獲取參數(shù)
    opts, args = getopt.getopt(sys.argv[1:], "d:k:c:f:i:")
    if len(opts)==0:
        print msg
        sys.exit(0)

    for op, value in opts:
        if op == "-d":
            func_name = value
        elif op == "-k":
            key_content = value
        elif op == "-c":
            txt_content = value
        elif op == "-f":
            file_name = value
        elif op == "-i":
            info_name = value
    #print(opts)  
    #初始化密鑰
    pc = optcrypt(key_content)
    #根據(jù)功能類型執(zhí)行
    if func_name in("se","sd"):
        print stringCrpyt(func_name,txt_content)
    elif func_name in ("ie","id"):
        print infoCrpyt(func_name,file_name,info_name)    
    elif func_name in ("fe","fd"):
        print fileCrpyt(func_name,file_name)
    else:
        print("there is no function named "+func_name)
    sys.exit(0)

注意在項(xiàng)目文件夾中增加一個init.py文件以便于腳本能識別optcrypt模塊钻趋。

測試腳本test.sh:

#!/bin/bash

#依賴python pycrypt模塊  安裝這個模塊的命令是 python setup.py install 
#系統(tǒng)必須現(xiàn)安裝yum install python-devel
#測試加解密程序
#c3VubGluZW1kcDIwMTgxMQ== 是對 sunlinemdp201811 進(jìn)行base64編碼后的值 可以修改  方法為:
# 1.命令行執(zhí)行 python 進(jìn)入python編程環(huán)境
# 2.執(zhí)行以下代碼 
# import base64
# print s= base64.b64encode("sunlinemdp201811")    # 引號內(nèi)為想編碼的密鑰文本

#幫助
python server.py
#字符串加密
python server.py -d se -k c3VubGluZW1kcDIwMTgxMQ== -c sunline
#字符串解密
python server.py -d sd -k c3VubGluZW1kcDIwMTgxMQ== -c cd3f4a3b1c4a189d3fe985495f6f963b
#文件加密
python server.py -d fe   -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties
#文件解密
python server.py -d fd   -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties.fecrypt
#信息項(xiàng)加密輸出
python server.py -d ie  -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties -i database.ora10g.username
#信息項(xiàng)解密輸出
python server.py -d id  -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties.fecrypt -i database.ora10g.username

#shell中獲取python輸出值的方法:
outputString=`python server.py -d ie  -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties -i database.ora10g.username`
echo outputString:${outputString}
outputFile=`python server.py -d fe   -k c3VubGluZW1kcDIwMTgxMQ==  -f global.properties`
echo outputFile:${outputFile}

輸出結(jié)果:

[root@localhost encrypt]# ./test.sh
使用說明:python server.py 
         -d [選擇方法[se 字符串加密 /sd 字符串解密/ie 信息項(xiàng)加密/id 信息項(xiàng)解密/fe 文件加密/fd 文件加密]]  
         -k [16位密鑰]
         -c [加密內(nèi)容]
         -f [文件名稱]
         -i [信息項(xiàng)名稱]
         字符串加解密必選項(xiàng): -k -c 
         信息項(xiàng)加解密必選項(xiàng): -k -f -i
         文件加解密必選項(xiàng):    -k -f 
         
cd3f4a3b1c4a189d3fe985495f6f963b
sunline
global.properties.fecrypt
global.properties.fecrypt.fdcrypt
d518cdd30b854b84f5aa7c5511e03e38
dw
outputString:d518cdd30b854b84f5aa7c5511e03e38
outputFile:global.properties.fecrypt

后續(xù)會對腳本進(jìn)行內(nèi)容補(bǔ)充,主要是增加一些之前為了功能實(shí)現(xiàn)而忽略的異常處理和日志登記的內(nèi)容沼头。

程序代碼地址
加密算法介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市书劝,隨后出現(xiàn)的幾起案子进倍,更是在濱河造成了極大的恐慌,老刑警劉巖购对,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猾昆,死亡現(xiàn)場離奇詭異,居然都是意外死亡骡苞,警方通過查閱死者的電腦和手機(jī)垂蜗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來解幽,“玉大人贴见,你說我怎么就攤上這事《阒辏” “怎么了片部?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霜定。 經(jīng)常有香客問我档悠,道長,這世上最難降的妖魔是什么望浩? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任辖所,我火速辦了婚禮,結(jié)果婚禮上磨德,老公的妹妹穿的比我還像新娘缘回。我一直安慰自己,他們只是感情好典挑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布切诀。 她就那樣靜靜地躺著,像睡著了一般搔弄。 火紅的嫁衣襯著肌膚如雪幅虑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天顾犹,我揣著相機(jī)與錄音倒庵,去河邊找鬼褒墨。 笑死,一個胖子當(dāng)著我的面吹牛擎宝,可吹牛的內(nèi)容都是我干的郁妈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绍申,長吁一口氣:“原來是場噩夢啊……” “哼噩咪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起极阅,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胃碾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筋搏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仆百,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年奔脐,在試婚紗的時候發(fā)現(xiàn)自己被綠了俄周。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡髓迎,死狀恐怖峦朗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情排龄,我是刑警寧澤甚垦,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站涣雕,受9級特大地震影響艰亮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挣郭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一迄埃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兑障,春花似錦侄非、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至福澡,卻和暖如春叠赦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背革砸。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工除秀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糯累,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓册踩,卻偏偏與公主長得像泳姐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暂吉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,881評論 2 8
  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,688評論 0 8
  • 這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中胖秒,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲慕的、登錄驗(yàn)證這幾個方面涉及的加密...
    雨_樹閱讀 2,432評論 0 6
  • 我想阎肝,最美的愛情莫過于自從遇見你,我的生活變的燦爛业稼,有趣盗痒。從你的眼里我看到最美的自己蚂蕴,從你的身上我感受到最暖的溫柔...
    小苜蓿閱讀 2,033評論 3 7
  • 每個人在日常生活中都有各種各樣的習(xí)慣低散,如果,單從表面來看骡楼,它是一件小事熔号,美國成功學(xué)大師拿破侖·希爾說:“習(xí)慣能夠成...
    溫粥人wzr閱讀 874評論 0 1