[自己做个游戏服务器三]你帮我为服务器选择一种加密算法,Java实现各种加解密算法

简介: 毕业好多年了,虽然大学专业学的是信息安全,在大学的时候学过各种加密算法,但是毕业后也没有从事安全行业,一直在做游戏,做web开发,在工作中使用加解密的机会还真不多,但是加解密确实也一直在身边,比如我们游戏通信协议不可避免的对数据进行加密,要不然的话,随便解包有点危险,刷协议骚扰服务器。今天就来聊下常用的加密算法,接下来的服务器也要选择一种加密算法,你帮我选一种?

7a9d7985a7a04ee9a87702576eb66c6d~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

毕业好多年了,虽然大学专业学的是信息安全,在大学的时候学过各种加密算法,但是毕业后也没有从事安全行业,一直在做游戏,做web开发,在工作中使用加解密的机会还真不多,但是加解密确实也一直在身边,比如我们游戏通信协议不可避免的对数据进行加密,要不然的话,随便解包有点危险,刷协议骚扰服务器。今天就来聊下常用的加密算法,接下来的服务器也要选择一种加密算法,你帮我选一种?


1、加密算法分类


加密算法大的分类分为可解密算法和不可解密算法


比如 MD5SHAHMAC这三种加密算法,是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法,常用作验证数据安全。


BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法)


加密算法一般本分 对称加密和非对称加密


比如 基于“[对称密钥]”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish


非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)


2、加密算法实现

1. BASE64

Base64用于网络中传输的数据进行编码,严格意义上属于编码的格式,有64个字符的对应的编码,Base64就是将内容按照该格式进行编码。可以对数据编码和解码,是可逆的,安全度较低,不过,也可以作为最基础最简单的加密算法用于加密要求较弱的情况。


Base64可以使用JDk中自带的类实现,还可以使用Bouncy Castle(简称bc)或Commons Codec(简称cc)实现

来个例子:


import org.apache.commons.codec.binary.Base64;
public class Aain {
    public static byte[] encode2Base64(byte[] bytes) {
        byte[] bts = Base64.encodeBase64(bytes);
        return bts;
    }
    public static byte[] decode2Base64(String str) {
        byte[] bts = Base64.decodeBase64(str);
        return bts;
    }
}
复制代码


2. MD5


MD5(信息-摘要算法5),用于确保信息传输完整一致。,主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值。


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Aain {
    public static String md5(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            return new String(digest.digest(str.getBytes()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    public static void main(String[] args) {
        System.out.println(md5("ddddddddddddd"));;
    }
}
复制代码


linux 下支持md5 命令


计算 文件的md5值
md5sum final.nnet 
复制代码


3.SHA


安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种"指纹"或是"摘要"所以对散列值的数字签名就可以视为对此明文的数字签名。


import java.math.BigInteger;
import java.security.MessageDigest;
public class Aain {
    public static final String  KEY_SHA = "SHA";
    public static void sha(String inputStr) {
        byte[] inputData = inputStr.getBytes();
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);
            messageDigest.update(inputData);
            BigInteger sha = new BigInteger(messageDigest.digest());
            System.out.println("SHA加密后:" + sha.toString(32));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        sha("ddddddddddddd");
    }
}
复制代码


4.AES


AES加密是对称加密 128 192 256 分别表示密钥的长度


AES的加密方式会将明文拆分成不同的块进行加密


AES现在广泛用于金融财务、在线交易、无线通信、数字存储等领域,经受了最严格的考验,但说不定哪天就会步DES的后尘。


package com.xin;
import org.springframework.util.Base64Utils;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
public class Aain {
    private static final String KEY_ALGORITHM = "AES";
    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//默认的加密算法
    /**
     * AES 加密操作
     *
     * @param content 待加密内容
     * @param key     加密密钥
     * @return 返回Base64转码后的加密数据
     */
    public static String encrypt(String content, String key) {
        try {
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器
            byte[] byteContent = content.getBytes();
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));// 初始化为加密模式的密码器
            byte[] result = cipher.doFinal(byteContent);// 加密
            return Base64Utils.encodeToString(result);//通过Base64转码返回
        } catch (Exception ex) {
        }
        return null;
    }
    /**
     * AES 解密操作
     *
     * @param content
     * @param key
     * @return
     */
    public static String decrypt(String content, String key) {
        try {
            //实例化
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            //使用密钥初始化,设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
            //执行操作
            byte[] result = cipher.doFinal(Base64Utils.decodeFromString(content));
            return new String(result);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
    /**
     * 生成加密秘钥
     *
     * @return
     */
    private static SecretKeySpec getSecretKey(final String key) {
        //返回生成指定算法密钥生成器的 KeyGenerator 对象
        KeyGenerator kg = null;
        try {
            kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            //AES 要求密钥长度为 128
            kg.init(128, new SecureRandom(key.getBytes()));
            //生成一个密钥
            SecretKey secretKey = kg.generateKey();
            return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);// 转换为AES专用密钥
        } catch (NoSuchAlgorithmException ex) {
        }
        return null;
    }
    public static void main(String[] args) {
        String content = "大家好,我是香菜,公众号:香菜聊游戏";
        String key = "sde@5f98H*^hsff%dfs$r344&df8543*er";
        System.out.println("content:" + content);
        String s1 = Aain.encrypt(content, key);
        System.out.println("加密后内容 :" + s1);
        System.out.println("解密后内容:" + Aain.decrypt(s1, key));
    }
}
复制代码


3、总结


加密算法是游戏协议必须要用的,但是也不复杂,一次性工作,网上也有大片的解决方案,但是自己写一下还是必要的,事情只有在下手的那一刻才会遇到困难。


还有就是不试试你怎么好让自己放弃。哈哈,不扯了,加油吧

目录
相关文章
|
9天前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
|
2天前
|
弹性计算 缓存 负载均衡
【阿里云弹性计算】游戏服务器部署实战:利用阿里云ECS打造低延迟游戏环境
【5月更文挑战第24天】使用阿里云ECS打造低延迟游戏环境的实战指南,包括选择高性能处理器和SSD存储的实例,规划架构,选择近玩家的地域和可用区,部署软件,优化性能及监控。通过负载均衡、自动扩展和数据缓存提升体验,同时关注数据安全与网络安全。
14 4
|
10天前
|
Java 关系型数据库 MySQL
MySql数据库级别MD5加密java MD5加密解密工具包
MySql数据库级别MD5加密java MD5加密解密工具包
|
11天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
14 0
|
11天前
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
|
11天前
|
网络协议 Ubuntu Java
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
59 0
|
11天前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
70 0
|
11天前
|
弹性计算 运维 Java
Serverless 应用引擎产品使用之在Serverless 应用引擎中,将 Java 应用从 ECS 迁移到 SAE如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
51 2
|
11天前
|
Java 应用服务中间件 PHP
企业Java应用服务器之JBoss7.1与Apahce整合
企业Java应用服务器之JBoss7.1与Apahce整合
|
11天前
|
网络协议 Java Windows
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
138 0