js 文本加密 php解密,JavaScript加密和PHP解密
小编典典
问题在于,在CryptoJS代码中,密码用于导出密钥,而IV用于AES加密,但是mcrypt仅使用密钥进行加密/解密。此信息需要传递给php。由于您不想传输密码,因此必须在php中以相同的方式派生密钥和IV。
以下代码从密码和盐中导出密钥和IV。它是根据我在此处的答案中的代码建模的(更多信息)。
function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {
$targetKeySize = $keySize + $ivSize;
$derivedBytes = "";
$numberOfDerivedWords = 0;
$block = NULL;
$hasher = hash_init($hashAlgorithm);
while ($numberOfDerivedWords < $targetKeySize) {
if ($block != NULL) {
hash_update($hasher, $block);
}
hash_update($hasher, $password);
hash_update($hasher, $salt);
$block = hash_final($hasher, TRUE);
$hasher = hash_init($hashAlgorithm);
// Iterations
for ($i = 1; $i < $iterations; $i++) {
hash_update($hasher, $block);
$block = hash_final($hasher, TRUE);
$hasher = hash_init($hashAlgorithm);
}
$derivedBytes .= substr($block, 0, min(strlen($block), ($targetKeySize - $numberOfDerivedWords) * 4));
$numberOfDerivedWords += strlen($block)/4;
}
return array(
"key" => substr($derivedBytes, 0, $keySize * 4),
"iv" => substr($derivedBytes, $keySize * 4, $ivSize * 4)
);
}
盐是在CryptoJS加密期间生成的,需要与密文一起发送到php。在调用evpKDF盐之前,必须先将其从十六进制转换为二进制字符串。
$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));
$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
$keyAndIV["key"],
hex2bin($cipherTextHex),
MCRYPT_MODE_CBC,
$keyAndIV["iv"]);
如果仅将encryptedPassword.toString()其发送到服务器,则有必要在使用前将盐和实际密文分开。该格式是与OpenSSL兼容的专有格式,前8个字节为“
Salted__”,后8个字节为随机盐,其余为实际密文。所有内容都经过Base64编码。
function decrypt($ciphertext, $password) {
$ciphertext = base64_decode($ciphertext);
if (substr($ciphertext, 0, 8) != "Salted__") {
return false;
}
$salt = substr($ciphertext, 8, 8);
$keyAndIV = evpKDF($password, $salt);
$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
$keyAndIV["key"],
substr($ciphertext, 16),
MCRYPT_MODE_CBC,
$keyAndIV["iv"]);
// unpad (PKCS#7)
return substr($decryptPassword, 0, strlen($decryptPassword) - ord($decryptPassword[strlen($decryptPassword)-1]));
}
使用OpenSSL扩展而不是Mcrypt可以实现相同的目的:
function decrypt($ciphertext, $password) {
$ciphertext = base64_decode($ciphertext);
if (substr($ciphertext, 0, 8) != "Salted__") {
return false;
}
$salt = substr($ciphertext, 8, 8);
$keyAndIV = evpKDF($password, $salt);
$decryptPassword = openssl_decrypt(
substr($ciphertext, 16),
"aes-256-cbc",
$keyAndIV["key"],
OPENSSL_RAW_DATA, // base64 was already decoded
$keyAndIV["iv"]);
return $decryptPassword;
}
2020-05-26
js 文本加密 php解密,JavaScript加密和PHP解密相关推荐
- JS 不可逆加密,高级 JavaScript 加密
高级 JS 加密方式:https://www.sojson.com/javascriptobfuscator.html (function(w, d) { w.info = "这是一个一系列 ...
- 真正的JavaScript加密和网页资源加密系统,从原理到实现
网站作为网民获取信息的主要来源之一,基于Html5的建站服务和应用越来越多,而Html5存在一个关键问题: 网页内的资源(包括了javascript.文字.图像等)可以通过非常简单的方式获取! 目前网 ...
- 加密越来越简单——用JavaScript实现数据加密和解密
加密越来越简单--用JavaScript实现数据加密和解密 概念 常用算法 1. MD5加密算法 2. SHA-1加密算法 3. AES加密算法 代码示例 结论 总结 在当今互联网的世界中,安全性越来 ...
- RSA javascript加密 lua解密
一个在线RSA非对称加密解密,可以用这个地址生成公钥和私钥 https://blog.zhengxianjun.com/online-tool/rsa/ javascript加密 jsencrypt. ...
- java和js实现前端加密后端解密,后端加密前端解密(Base64)
目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密 1.1 前端jqu ...
- JavaScript加密注意事项,怎么加密JS脚本最安全?
JavaScript加密话题 #. JavaScript 需不需要加密? #.怎么 加密JS 最安全? #.怎么把 JS 中的URL地址.秘钥隐藏起来? #. JavaScript加密 ...
- 【土旦】vue项目中 使用 pako.js 解密 gzip加密字符串
前言 今天跟后台对接一个接口,接受到一个加密的值,说是通过gzip加密过的,然后就蒙蔽了, 赶紧上百度找了一下资料,通过一篇文章(原文在底部)发现有个js库可以解密,就下载轻松解密了 实现代码 pok ...
- 使用Auto.js庖丁对Pro Snapshot快照加密的解密打包教程
学业繁重,废话少说! 自从Auto.js Pro在8.7.6版本之后,引用了一种新的加密方式Snapshot快照加密之后,越来越多的开发者使用了此加密方法,也是比较推荐的一种加密方式. 目前比较安全的 ...
- 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密
公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...
最新文章
- 使用Servlet完成单表的CRUD
- 易语言基础编程知识〖E语言手册〗
- Java 128陷阱+自动装箱拆箱
- 2017.9.25 随机数生成器 失败总结
- BP神经网络原理简介
- PDF 开发者 Charles Geschke 去世,39 年前联合创立软件巨头 Adobe!
- [TWLFramework] Singleton
- eclipse汉化教程(官方汉化包,傻瓜式操作,附带中英文快捷切换方式以及常见问题解决方案)
- java中的source_Linux中source命令的用法
- Raid5磁盘阵列数据恢复,服务器raid数据恢复步骤和方法
- php getdigest,http digest
- 通过电话拨号上网的家用计算机,拨号上网需计算机、电话线、帐号和()
- html涟漪动画效果,CSS+JS实现水滴涟漪动画按钮效果的示例代码
- 图论应用 floyd(弗洛伊德)算法、dijkstra(迪杰斯特拉)算法
- LOL自动走A和释放技能原理及安全防护
- IDEA javadoc快捷键
- 2018年山东外贸进出口1.93万亿元创历史新高
- GeneXus3 筛选条件
- [软件工程]敏捷过程模型的特性研讨——源自newsmth上的讨论
- MySQL内部联结和外部联结
热门文章
- 房屋征收管理系统高保真原型征收项目管理(项目预警)房屋测绘管理(测绘确权)协议管理测绘报表管理web端后台管理系统
- Axure电商后台业务管理系统原型模板+app电商原型交互+移动端电商通用PRD文档+全局交互用例说明+Axure高保真电商社交prd文档
- 多线程下单例模式的实现_ThreadLocal_ReentrantLock
- POJ 2409 Let it Bead【Polya定理】(模板题)
- (学习笔记)laravel 中间件
- SQL HQL JPQL CQL的对比
- 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
- Swift学习笔记(10)--枚举
- LeetCode OJ - Best Time to Buy and Sell Stock III
- Copy-On-Write容器之一:CopyOnWriteArrayList