UE4中实现PBKDF2加密验证
UE4中Crypto++库加密解密
第三节:UE4中实现PBKDF2加密验证
文章目录
- UE4中Crypto++库加密解密
- 前言
- 代码
- 1. C++代码
- 2. 蓝图
- 测试结果
- 参考
前言
通过哈希算法进行加密。因为哈希算法是单向的,可以将任何大小的数据转化为定长的“指纹”,而且无法被反向计算。另外,即使数据源只改动了一丁点,哈希的结果也会完全不同。这样的特性使得它非常适合用于保存密码,因为我们需要加密后的密码无法被解密,同时也能保证正确校验每个用户的密码。但是哈希加密可以通过字典攻击和暴力攻击破解。
密码加盐。盐是一个添加到用户的密码哈希过程中的一段随机序列。这个机制能够防止通过预先计算结果的彩虹表破解。每个用户都有自己的盐,这样的结果就是即使用户的密码相同,通过加盐后哈希值也将不同。为了校验密码是否正确,我们需要储存盐值。通常和密码哈希值一起存放在账户数据库中,或者直接存为哈希字符串的一部分。
提示:以下是本篇文章正文内容,下面案例可供参考
代码
首先要生成一个盐值salt,再把原始密码和salt加密得到密文。验证的时候,把用户输入的密码和同样的盐值salt使用相同的加密算法得到一个密文,将这个密文和原密文相比较,相同则验证通过,反之则不通过。
以下为实现逻辑:
1. C++代码
MyPBKDF2.h
#pragma once#include "CoreMinimal.h"#include "../ThirdParty/crypto/include/Win64/config_int.h"
#include "../ThirdParty/crypto/include/Win64/pwdbased.h"
#include "../ThirdParty/crypto/include/Win64/sha.h"
#include "../ThirdParty/crypto/include/Win64/hex.h"
#include "../ThirdParty/crypto/include/Win64/cryptlib.h"
#include "../ThirdParty/crypto/include/Win64/blake2.h"
#include "../ThirdParty/crypto/include/Win64/files.h"
#include "../ThirdParty/crypto/include/Win64/aes.h"
#include "../ThirdParty/crypto/include/Win64/modes.h"
#include "../ThirdParty/crypto/include/Win64/pubkey.h"
using namespace CryptoPP;#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyPBKDF2.generated.h"/*** */
UCLASS()
class TEST_API UMyPBKDF2 : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public://PBKDF2算法//验证密码UFUNCTION(BlueprintCallable, meta = (DisplayName = "authenticate", Keywords = "authenticate", pbkdf2_key = "0123456789ABCDEF0123456789ABCDEF"), Category = "PBKDF2")static bool authenticate(FString attemptedPassword, FString encryptedPassword, FString pbkdf2_key);//生成密文UFUNCTION(BlueprintCallable, meta = (DisplayName = "getEncryptedPassword", Keywords = "getEncryptedPassword", pbkdf2_key = "0123456789ABCDEF0123456789ABCDEF"), Category= "PBKDF2")static FString getEncryptedPassword(FString pbkdf2_content, FString pbkdf2_key);};
MyPBKDF2.cpp
include "MyPBKDF2.h"
/**
* 对输入的password进行验证
*
* @param attemptedPassword
* 待验证的password
* @param encryptedPassword
* 密文
* @param salt
* 盐值
* @return 是否验证成功
*/
#pragma region PBKDF2
bool UMyPBKDF2::authenticate(FString attemptedPassword, FString encryptedPassword, FString salt)
{// 用同样的盐值对用户输入的password进行加密FString encryptedAttemptedPassword = getEncryptedPassword(attemptedPassword, salt);// 把加密后的密文和原密文进行比較,同样则验证成功。否则失败return encryptedAttemptedPassword.Equals(encryptedPassword);
}/**
* 生成密文
*
* @param password
* 明文password
* @param salt
* 盐值
* @return
*/
FString UMyPBKDF2::getEncryptedPassword(FString pbkdf2_content, FString pbkdf2_key)
{std::string _pbkdf2_content = TCHAR_TO_UTF8(*pbkdf2_content);byte password[AES::MAX_KEYLENGTH];size_t plen = _pbkdf2_content.size();plen <= AES::MAX_KEYLENGTH ? memcpy(password, _pbkdf2_content.c_str(), plen) : memcpy(password, _pbkdf2_content.c_str(), AES::MAX_KEYLENGTH);std::string _pbkdf2_key = TCHAR_TO_UTF8(*pbkdf2_key);byte salt[AES::MAX_KEYLENGTH];size_t slen = _pbkdf2_key.size();slen <= AES::MAX_KEYLENGTH ? memcpy(salt, _pbkdf2_key.c_str(), slen) : memcpy(salt, _pbkdf2_key.c_str(), AES::MAX_KEYLENGTH);byte derived[SHA256::DIGESTSIZE];PKCS5_PBKDF2_HMAC<SHA256> pbkdf;byte unused = 0;pbkdf.DeriveKey(derived, sizeof(derived), unused, password, plen, salt, slen, 1024, 0.0f);std::string result;HexEncoder encoder(new StringSink(result));encoder.Put(derived, sizeof(derived));encoder.MessageEnd();return UTF8_TO_TCHAR(result.c_str());
}
#pragma endregion
2. 蓝图
测试结果
行效果如下:
完美实现加密验证。
参考
PBKDF2加密的实现
安全密码存储,该怎么做,不该怎么做?
Node.js crypto.pbkdf2()用法及代码示例
如何使用 PKCS5_PBKDF2_HMAC_SHA1()
PKCS5 PBKDF2 HMAC官方文档
crypto加密解密
UE4中实现PBKDF2加密验证相关推荐
- javascript 解密_Javascript中的AES加密和Java中的解密
javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...
- Javascript中的AES加密和Java中的解密
AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Andr ...
- 聊聊 iOS 中的网络加密
介绍下 公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使 ...
- python实现md5加密_Python实现md5加密验证访问接口总结
实现md5加密验证访问接口总结 作者:李祥权 [摘要] 在项目开发中,遇到用户端点登陆接口需要加密验证才可以登陆的情况,当我们需要访问对方的接口时,为了保证访问的安全性,使用python实现md5加密 ...
- Android+Java中使用RSA加密实现接口调用时的校验功能
场景 RSA加密 RSA算法是一种非对称加密算法,那么何为非对称加密算法呢? 一般我们理解上的加密是这样子进行的:原文经过了一把钥匙(密钥)加密后变成了密文,然后将密文传递给接收方,接收方再用这把钥匙 ...
- java 接口 安全加密_Java中的安全加密
java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...
- Java中的安全加密
上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中对敏感数据进行加密和解密." 我了解了 ...
- ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈
前言 多图, 不想在源代码写注释, 不想贴代码块, 看的不清楚 版本4.21混4.22, 区别不大 文章属于旧有文章搬运, 之前在csdn上面 2019.10.27修改一版 物体位置信息同步, 或者说 ...
- Java中常用的加密方法(JDK)
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- App渗透中常见的加密与解密。
随着App移动应用技术 的广泛应用及移动开发技术的飞速发展过程中,移动应用的安全也越来越被得到重视,在App服务端渗透中,我们在抓包时经常会发现App在数据传输过程中做了加密(如图1),以防止数据被查 ...
最新文章
- 微软Entity Framework安装和初步研究
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 90. 64位整数乘法:位运算
- Quartz框架多个trigger任务执行出现漏执行的问题分析--转
- Spring Boot 2.x 启动全过程源码分析(全)
- 性能测试关注点整理总结!
- Ubuntu 12.10中的8个新功能,Quantal Quetzal
- 一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
- PRML-系列一之1.5.5~1.5.6
- java建立新文件保存数据_关于java中创建文件,并且写入内容
- 使用JasperReport 引擎PDF报表,因为iText版本升级,由原来的包名com.lowagie.text.pdf.fonts转化为com.itextpdf.text.pdf.fonts
- 强命名防止dll被篡改
- python os模块详细_python中os模块函数方法详解最全最新
- [经典php视频]构建正则表达式解析网页中的图像标记img
- matlab 好看的颜色代码,科学网—什么是好的颜色表(colormap)? - 雷朝阳的博文...
- 方维众筹网站源码V1.71 PC+WAP+商业版
- 算法(arithmetic)
- 全文翻译:Deep Learning for Image Super-resolution: A Survey
- angular的传值,子传父,父传子
- WordPress网站利用WP2PCS-SY插件定时、增量网站备份至百度网盘
- js-获取子节点--具体节点调用