【python3】简易双因子Radius认证服务器,带UI界面


需要将dictionary.rfc2865放在运行的同级目录下

#_*_coding:utf-8_*_
from tkinter import *
from tkinter.ttk import *
from tkinter import scrolledtext
from tkinter import messagebox
import time
import os
import re
import socket
import threading
from os import environ
from os.path import join, exists
#from ico import img
#import base64
from pyrad import packet
import pyrad.dictionary
import pyrad.host
import random
import string

CHALLENGE_LEN = 6
CHALLENGE_TYPE = 6
CHALLENGE = "BAdPassw0d"
FilterId = ""

class RadiusServer(pyrad.host.Host):
    def __init__(self):
        dict = pyrad.dictionary.Dictionary("dictionary.rfc2865") #从freeradius中搞一个通用的字典使用
        pyrad.host.Host.__init__(self, dict=dict)

    def get_challenge(self):
        if CHALLENGE_TYPE == 1:
            return (''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))).upper()
        if CHALLENGE_TYPE == 2:
            return (''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))).lower()
        if CHALLENGE_TYPE == 4:
            return ''.join(random.choice(string.ascii_letters) for _ in range(CHALLENGE_LEN))
        if CHALLENGE_TYPE == 6:
            return ''.join(random.choice(string.digits) for _ in range(CHALLENGE_LEN))
        if CHALLENGE_TYPE == 8:
            return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(CHALLENGE_LEN))

    def check_pap_pass(self, radpkt):
        global CHALLENGE
        if radpkt.PwCrypt(CHALLENGE) == radpkt["User-Password"][0]:
            radpkt.code = packet.AccessAccept
            if(len(FilterId)>0):
                radpkt['Filter-Id'] = FilterId
                radpkt['Class'] = FilterId  #安盟使用的安全组信息
            return("用户名:%-16s 状态:挑战码认证通过" % radpkt["User-Name"][0])
        elif radpkt.PwCrypt("Authpasswd") == radpkt["User-Password"][0]:
            radpkt.code = packet.AccessChallenge
            CHALLENGE = self.get_challenge()
            radpkt['Reply-Message'] = "Enter Token Code"
            radpkt['State'] = ("CHALLENGE=%s" % CHALLENGE).encode()
            return("用户名:%-16s 状态:待挑战认证 挑战码:%s" % (radpkt["User-Name"][0],CHALLENGE))
        elif radpkt.PwCrypt("password") == radpkt["User-Password"][0]:
            radpkt.code = packet.AccessAccept
            if(len(FilterId)>0):
                radpkt['Filter-Id'] = FilterId
            return("用户名:%-16s 状态:认证通过" % radpkt["User-Name"][0])
        # elif radpkt.PwCrypt(PIN+"password") == radpkt["User-Password"][0]:
        #     radpkt.code = packet.AccessAccept
        #     return("用户名:%-16s 状态:PIN认证通过" % radpkt["User-Name"][0])
        else:
            radpkt.code = packet.AccessReject
            return("用户名:%-16s 状态:认证失败" % radpkt["User-Name"][0])

    def get_pkt(self, pkt):
        get_pw = None
        get_name = None
        radpkt = self.CreateAuthPacket(packet=pkt) #解析请求报文
        radpkt.secret = b"sharepasswd"
        #radpkt.secret = bytes(secret, encoding = "utf8")

        for key in radpkt.keys():
            print(key, radpkt[key])
        print("="*60)
        info = ""
        radpkt.code = packet.AccessAccept
        if "User-Password" in radpkt.keys():
            info = self.check_pap_pass(radpkt)
        else:
            info = "用户名:%-16s 状态:CHAP通过   IP:%s" % (radpkt['User-Name'][0],radpkt['NAS-IP-Add
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值