php和js 加密

对称加密(就是加密和解密是一个密钥)

AES(就用这个就行,DES不安全)(注意启用openssl)

//获取可用的加密算法
$a = openssl_get_cipher_methods();
//这个可以打印出有哪里加密方式
//print_r($a);
//AES加密解密
$data = '我是需要加密的内容';//待加密的数据
$key = uniqid();//加密的密钥
$method = 'AES-128-CBC';//加密的方式
// $method="AES-128-ECB"; //如果采用这个加密就不需要 $iv 变量了,他们两个区别是是否需要第五个参数
$iv = '1234567812345678';//初始化向量,必须是16位字符,md5(uniqid(),true) 这样会生成16字符串
$a = openssl_encrypt($data,$method,$key,OPENSSL_RAW_DATA,$iv);
//打印加密结果,$a 是二进制的加密结果,转成 base64 好保存
dump($b=base64_encode($a));
//解密,这里先使用base64 解开为2进制,然后在找回内容
$d = openssl_decrypt(base64_decode($b),$method,$key,OPENSSL_RAW_DATA,$iv);
//解密后的数据
dump($d);
//node 版
const crypto = require('crypto');
function aesEncrypt(data, key, iv) {
  const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
  let encrypted = cipher.update(data, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}
function aesDecrypt(encrypted, key, iv) {
  const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}


const data = 'hello world';
const key = crypto.randomBytes(32);		// 密钥,一个 Buffer 类
const iv = crypto.randomBytes(16);		// 初始化向量,一个 Buffer 类
const encrypted = aesEncrypt(data, key, iv);
const decrypted = aesDecrypt(encrypted, key, iv);


console.log(`原始数据: ${data}`);
console.log(`密钥: ${key}`);
console.log(`初始化向量: ${iv}`);
console.log(`加密后的数据: ${encrypted}`);
console.log(`解密后的数据: ${decrypted}`);

/*
const data = '1';
const key = Buffer.from('01234567890123456789012345678901', 'utf-8');
const iv = Buffer.from('0123456789012345', 'utf-8');
const encrypted = aesEncrypt(data, key, iv);
const decrypted = aesDecrypt(encrypted, key, iv);
==> 
原始数据: 1
密钥: 01234567890123456789012345678901
初始化向量: 0123456789012345
加密后的数据: 8fa6aaeb56062010a71b3750cc337fe5
解密后的数据: 1
*/
//js版
下载地址:https://cdnjs.com/libraries/crypto-js

var aseKey = "12345678"     //秘钥必须为:8/16/32位
var message = "80018000142";
//加密
var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
}).toString();
console.log(encrypt);    //VKrZlqykem73x8/T2oCfCQ==
 
//解密
var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), {
  mode: CryptoJS.mode.ECB,
  padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(decrypt);    //80018000142
 
//cbc 模式
var key = CryptoJS.enc.Utf8.parse("zhgerXHBVaaKm8xy") 
var plaintText = 'onlystar'
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
    iv:  CryptoJS.enc.Utf8.parse(key),
    mode: CryptoJS.mode.CBC,  
    padding: CryptoJS.pad.Pkcs7
})
 
console.log("加密前:"+plaintText) // 加密前:onlystar
console.log("加密后:"+encryptedData) // 加密后:cp7hxlPgStaA4Jod5uKCuQ==
 
encryptedData = encryptedData.ciphertext.toString()
 
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData)
console.log("解密前hex:"+encryptedHexStr) // 解密前hex:729ee1c653e04ad680e09a1de6e282b9
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr)
console.log("解密前:"+encryptedBase64Str) // 解密前:cp7hxlPgStaA4Jod5uKCuQ==
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { 
    iv:  CryptoJS.enc.Utf8.parse(key),
    mode: CryptoJS.mode.CBC,  
    padding: CryptoJS.pad.Pkcs7
})
 
var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8)
console.log("解密后:"+decryptedStr) // 解密后:onlystar

使用非对称加密(就是加密,解密不是一个密钥)(缺点不适合加载大文件,并且必对称加密慢了不少)

//执行php命令,目的生成公钥和私钥
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem
第二条命令将原始 RSA私钥转换为 pkcs8格式
第三条生成RSA公钥 rsa_public_key.pem
//使用公钥加密,私钥解密, 这个我并没有实际用过,在自己写sdk时候使用
$public_key = "公钥"; 
$private_key = "私钥"; 
$text = "我是待加密的内容";
//公钥加密,参数二$data为加密后的内容
//参数三:私钥
$res = openssl_private_encrypt($text,$encrypt,$private_key);
if($res==false) echo '加密失败';
//私钥解密,参数一:待解密的数据  
//参数二:解密后的明文内容
//参数三:公钥
$res = openssl_public_decrypt($encrypt,$decrypt,$public_key );
if($res==false) echo '解密失败';
echo '解密后的明文数据:'.$decrypt;

摘要加密

md5
//php版
//这里是一个字符串
$str = "this is zifuchuan";
//通过MD5加密函数加密
$res = md5($str);

//返回二进制, 第二个参数会添加为true,返回16位字符串
$res = md5($str,true);
//js版
md5下载地址:https://gitcode.net/mirrors/blueimp/javascript-md5?utm_source=csdn_github_accelerator
字节cdn:https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/blueimp-md5/2.19.0/js/md5.js
//引入就可以了,16位就是32位的中间16位
let hash = md5("value"); // "2063c1608d6e0baf80249c42e2be5804"
sha1
//php版
//需要加密的字符串
$str = "this is string";
//通过sha1进行加密
$res = sha1($str);

//通过指定第二个参数加密,返回的是二进制文件
$res = sha1($str,true);
//js版
sha1下载地址:https://gitcode.net/mirrors/emn178/js-sha1
字节cdn:https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/js-sha1/0.6.0/sha1.js
//引入就可以了,16位就是32位的中间16位
let hash = sha1("value"); 
Crypt(不建议用,每个平台不一样,配置在php里面设置,如果就在一个机器使用可以使用他)
//需要加密的字符串
$str = "this is string";
//使用crypt加密,不指定盐值
$res = crypt($str);

//指定盐值,但是盐值只能写两位,如果超过了则只会取前两位,在某些系统中会直接返回FALSE
$res = crypt($str,'jm');
password (推荐使用)
$pass='123456';
$jieguo=password_hash($pass,PASSWORD_DEFAULT);
dump($jieguo);
dump(password_verify($pass,$jieguo));


password_hash() – 对密码加密.
password_verify() – 验证已经加密的密码,检验其hash字串是否一致.
password_needs_rehash() – 给密码重新加密.
password_get_info() – 返回加密算法的名称和一些相关信息.

其他

//php版
//base64加密函数
base64_encode($data);

//base64解密函数
base64_decode($data);
//js 版本
var str = "hello";
var str64 = window.btoa("hello");
console.log("字符串是:"+str);
console.log("经base64编码后:"+str64);
console.log("base64解码后:"+window.atob(str64));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个人的幸福online

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值