91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Java實現Radius客戶端功能

發布時間:2021-06-23 14:40:06 來源:億速云 閱讀:579 作者:chen 欄目:編程語言

本篇內容主要講解“怎么用Java實現Radius客戶端功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Java實現Radius客戶端功能”吧!

實現功能

使用Java實現Radius客戶端,和服務端進行交互。(當前只實現了PAP模式)

代碼實現

主要代碼如下: RadiusClient.java

package radius;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *     0                   1                   2                   3
 *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *    |     Code      |  Identifier   |            Length             |
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *    |                                                               |
 *    |                         Authenticator                         |
 *    |                                                               |
 *    |                                                               |
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *    |  Attributes ...
 *    +-+-+-+-+-+-+-+-+-+-+-+-+-
 */
public class RadiusClient {
    private String secret;
    private String ip;
    private int port;

    public RadiusClient(String secret, String ip, int port) {
        this.secret = secret;
        this.ip = ip;
        this.port = port;
    }

    public byte[] generateAuthRequest(PacketType packetType, String username, char[] password)
            throws IOException, NoSuchAlgorithmException {
        return getSendBytes(packetType.code, username, password);
    }

    private void receive(DatagramSocket ds) throws IOException {
        byte[] bs = new byte[4096];
        DatagramPacket packet = new DatagramPacket(bs, bs.length);
        ds.receive(packet);
        System.out.println("receive success.");
        int recvType = bs[0];
        if (recvType == PacketType.ACCESS_ACCEPT.code) {
            System.out.println(PacketType.ACCESS_ACCEPT.name());
            parseResponse(bs);
        } else if (recvType == PacketType.ACCESS_REJECT.code) {
            System.out.println(PacketType.ACCESS_REJECT.name());
            parseResponse(bs);
        } else {
            System.err.println("invalid response packet type: " + recvType);
        }
    }

    private void parseResponse(byte[] bs) {
        int identifier = bs[1];
        int len = bs[2];
        len = len << 8;
        len = len | bs[3];
        System.out.println("response length: " + len);

        resolveAttr(bs, len);
    }

    private void resolveAttr(byte[] bs, int totalLen) {
        int index = 20;
        while (index < totalLen) {
            int type = bs[index++];
            int len = bs[index++];
            byte[] attrValue = new byte[len - 2];
            System.arraycopy(bs, index, attrValue, 0, attrValue.length);
            index += attrValue.length;
            System.out.println(String.format("attr type: %s, value: %s", type, new String(attrValue)));
        }
    }

    public void send(byte[] data) {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket();

            DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName(ip), port);
            ds.send(packet);
            System.out.println("sent success.");
            receive(ds);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ds != null) {
                ds.close();
            }
        }
    }

    private byte[] getSendBytes(int accessType, String username, char[] password)
            throws NoSuchAlgorithmException, IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bos.write(accessType); // Code
        Random ran = new Random();
        bos.write(ran.nextInt(255)); // Identifier
        // Authenticator
        byte[] authenticator = randomBytes(16);

        List<RadiusAttr> attrs = new ArrayList<>();
        attrs.add(new RadiusAttr(1, username.getBytes()));

        // password
        byte[] cipherPwd = encryptPassword(password, authenticator);
        attrs.add(new RadiusAttr(2, cipherPwd));

        int length = calculateTotalLength(attrs);  // Length
        System.out.println("request length: " + length);
        int highLen = length >> 8;
        bos.write(highLen);
        bos.write(length);

        bos.write(authenticator); // Authenticator

        for (RadiusAttr attr : attrs) {
            bos.write(attr.getType());
            bos.write(attr.length());
            bos.write(attr.getValue());
        }
        return bos.toByteArray();
    }

    private byte[] encryptPassword(char[] pwd, byte[] authenticator) throws NoSuchAlgorithmException {
        if (pwd.length > 128) {
            throw new IllegalArgumentException("password length is too long: " + pwd.length);
        }

        byte[] pwdBytes = new String(pwd).getBytes();
        List<byte[]> cipherBlocks = new ArrayList<>();
        for (int i = 0; i < pwdBytes.length; i += 16) {
            byte[] pwdI = new byte[16];
            int tmpLen = 16;
            if (i + 16 >= pwdBytes.length) {
                tmpLen = pwdBytes.length - i;
            }
            System.arraycopy(pwdBytes, i, pwdI, 0, tmpLen);

            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(secret.getBytes());
            if (cipherBlocks.isEmpty()) {
                md.update(authenticator);
            } else {
                md.update(cipherBlocks.get(cipherBlocks.size() - 1));
            }
            byte[] md5 = md.digest();

            byte[] result = new byte[16];
            for (int j = 0; j < result.length; j++) {
                result[j] = (byte) (pwdI[j] ^ md5[j]);
            }

            cipherBlocks.add(result);
        }

        List<Byte> list = new ArrayList<>();
        for (byte[] bs : cipherBlocks) {
            for (byte b : bs) {
                list.add(b);
            }
        }

        byte[] result = new byte[list.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = list.get(i);
        }
        return result;
    }

    private static int calculateTotalLength(List<RadiusAttr> attrs) {
        int len = 20; // code + identifier + length + authenticator
        for (RadiusAttr attr : attrs) {
            len += attr.length();
        }
        return len;
    }

    private static byte[] randomBytes(int length) {
        byte[] bs = new byte[length];
        Random ran = new Random();
        for (int i = 0; i < length; i++) {
            bs[i] = (byte) ran.nextInt(255);
        }
        return bs;
    }
}

調用方法:

package radius;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;

public class ClientTest {
    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
        String secret = "secret";
        String ip = "192.168.1.1";
        int port = 1812;

        RadiusClient radiusClient = new RadiusClient(secret, ip, port);
        byte[] bs = radiusClient.generateAuthRequest(PacketType.ACCESS_REQUEST,
            "username", "password".toCharArray());
        radiusClient.send(bs);
    }
}

到此,相信大家對“怎么用Java實現Radius客戶端功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荔波县| 湘乡市| 尼玛县| 墨竹工卡县| 澄迈县| 五家渠市| 泗阳县| 新宾| 太康县| 梅州市| 延庆县| 安塞县| 保定市| 景泰县| 深州市| 黎川县| 兴海县| 宁安市| 都昌县| 剑阁县| 米林县| 新竹市| 高台县| 大方县| 高尔夫| 津南区| 安平县| 两当县| 宁明县| 虹口区| 彩票| 南丹县| 石首市| 闽侯县| 西吉县| 北海市| 辛集市| 武冈市| 深水埗区| 泸州市| 车致|