1.在前端生成ssh-token ----根据用户名查询是否有这个用户,如果有 取得数据库密码(AES) +时间段 进行加密码(AES)
2.生成的ssk-token 一分钟内有效 ,如果超过一分钟则返回ssh 失败
如果 一分钟内,则用户名与ssk-token 验证通过
代码:
展示逻辑
1.前端
2.view:
产生 ssh-token逻辑
1.前端
2.view:
简单地用aes+时间来生成串 防止密码漏。
webssh项目修改handle.py
handle.py
from Cryptodome.Cipher import AES
from Cryptodome import Random
from binascii import b2a_hex , a2b_hex
import time
data:要加密的数据
key_16:密钥
iv:密钥向量
'''
def encrypt(data,key_16,iv_16):
AES_LENGTH = 16
#iv = Random.new().read(AES.block_size)
mycipher = AES.new(key_16, AES.MODE_CFB, iv_16)
ciphertext = iv_16 + mycipher.encrypt(data.encode())
#print '加密后数据为:', b2a_hex(ciphertext)[16:]
#print '解密后数据为:', decrypttext.decode()
## 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
return b2a_hex(ciphertext)
'''AES解密
data加密数据 是b2a_hex 16进制
key_16:密钥
iv_16:密钥向量
key_16 iv_16要与 加密 时用的一致
'''
def decrypt(data,key_16,iv_16):
#print 'data:',len(data)
mydecrypt = AES.new(key_16, AES.MODE_CFB, iv_16)
decrypttext = mydecrypt.decrypt(a2b_hex(data)[16:])
return decrypttext.decode()
def get_args(self):
hostname = self.get_hostname()
port = self.get_port()
if isinstance(self.policy, paramiko.RejectPolicy):
self.lookup_hostname(hostname, port)
username = self.get_value('username')
password = self.get_argument('password', u'')
#xiao
if password:
#do not modify this key_id and iv_16 contents
key_16 = b'aaaaajpSZlVAmkxh9'
iv_16 = b'bbbbbqdz1aFuAHi'
destr=decrypt(password,key_16,iv_16)
#print "all 解密后的数据<ssh>:",destr
destr_arr=destr.split('@')
p_time=int(destr_arr[-1])
nowtime = int(time.time())
if nowtime - p_time >60:
raise ValueError('ssh token expired!!')
if len(destr_arr)>2:
password = ('@'.join(destr_arr[0:len(destr_arr)-1])).rstrip()
else:
password = destr_arr[0].rstrip()
# print "aaaaaaa:",password,str(p_time)