当前位置:首页 » 密码管理 » src加密

src加密

发布时间: 2023-07-14 23:37:45

‘壹’ 运行php页面时,给js src路径解密,并且查看路径时 js路径是加密路径怎么实现

如果你是想让人无法获得这个js脚本,这种加密是无意义的,只要把网页另存为,js脚本就全部下载下来了,

你应该试试js混淆加密压缩。把js本身的程序混淆掉让人无法辨读。比较好的方式是用php自动混淆js代码,js源码也存在服务器上,但网页调用的是混淆后的js文件,用一个php来自动生成混淆js源码文件,这样就不会造成混淆后自己也不小心遗失源码。
比如用风吟PHP JS混淆工具还有其他被公布出来的混淆工具

‘贰’ des 加密方法cipher.doFianl(src) 返回的byte类型密文是几进制的是二进制吗

计算机存储都是2进制。这里都不涉及进制,2以外的进制只在文本表现时有文字意义。
byte的8bit特性决定了其类似于256进制,但和des输出没有直接关系。
产生密文就是字节数据,是变换后的原输入,
比如原来1,现在加1变成2。你只拿到2,就不知道原来数是1,
只有数据本身和数据长度。想要解读就必须要解码算法,按进制没有意义。

‘叁’ 对称加密算法以及使用方法

加密的原因:保证数据安全

加密必备要素:1、明文/密文    2、秘钥    3、算法

秘钥:在密码学中是一个定长的字符串、需要根据加密算法确定其长度

加密算法解密算法一般互逆、也可能相同

常用的两种加密方式:

对称加密:秘钥:加密解密使用同一个密钥、数据的机密性双向保证、加密效率高、适合加密于大数据大文件、加密强度不高(相对于非对称加密)

非对称加密:秘钥:加密解密使用的不同秘钥、有两个密钥、需要使用密钥生成算法生成两个秘钥、数据的机密性只能单向加密、如果想解决这个问题、双向都需要各自有一对秘钥、加密效率低、加密强度高

                    公钥:可以公开出来的密钥、公钥加密私钥解密

                    私钥:需要自己妥善保管、不能公开、私钥加密公钥解密

安全程度高:多次加密

按位异或运算

凯撒密码:加密方式    通过将铭文所使用的字母表按照一定的字数平移来进行加密

mod:取余

加密三要素:明文/密文(字母)、秘钥(3)、算法(向右平移3/-3)

安全常识:不要使用自己研发的算法、不要钻牛角尖、没必要研究底层实现、了解怎么应用;低强度的密码比不进行任何加密更危险;任何密码都会被破解;密码只是信息安全的一部分

保证数据的机密性、完整性、认证、不可否认性

计算机操作对象不是文字、而是由0或1排列而成的比特序列、程序存储在磁盘是二进制的字符串、为比特序列、将现实的东西映射为比特序列的操作称为编码、加密又称之为编码、解密称之为解码、根据ASCII对照表找到对应的数字、转换成二进制

三种对称加密算法:DES\3DES\ AES  

DES:已经被破解、除了用它来解密以前的明文、不再使用

密钥长度为56bit/8、为7byte、每隔7个bit会设置一个用于错误检查的比特、因此实际上是64bit

分组密码(以组为单位进行处理):加密时是按照一个单位进行加密(8个字节/64bit为一组)、每一组结合秘钥通过加密算法得到密文、加密后的长度不变

3DES:三重DES为了增加DES的强度、将DES重复三次所得到的一种加密算法   密钥长度24byte、分成三份  加密--解密--加密 目的:为了兼容DES、秘钥1秘钥2相同==三个秘钥相同  ---加密一次        密钥1秘钥3相同--加密三次    三个密钥不相同最好、此时解密相当于加密、中间的一次解密是为了有三个密钥相同的情况

此时的解密操作与加密操作互逆,安全、效率低

数据先解密后加密可以么?可以、解密相当于加密、加密解密说的是算法

AES:(首选推荐)底层算法为Rijndael   分组长度为128bit、密钥长度为128bit到256bit范围内就可以   但是在AES中、密钥长度只有128bit\192bit\256bit     在go提供的接口中、只能是16字节(128bit)、其他语言中秘钥可以选择

目前为止最安全的、效率高

底层算法

分组密码的模式:

按位异或、对数据进行位运算、先将数据转换成二进制、按位异或操作符^、相同为真、不同为假、非0为假    按位异或一次为加密操作、按位异或两次为解密操作:a和b按位异或一次、结果再和b按位异或

ECB : 如果明文有规律、加密后的密文有规律不安全、go里不提供该接口、明文分组分成固定大小的块、如果最后一个分组不满足分组长度、则需要补位

CBC:密码链

问题:如何对字符串进行按位异或?解决了ECB的规律可查缺点、但是他不能并行处理、最后一个明文分组也需要填充 、初始化向量长度与分组长度相同

CFB:密文反馈模式

不需要填充最后一个分组、对密文进行加密

OFB:

不需要对最后一组进行填充

CTR计数器:

不需要对最后一组进行填充、不需要初始化向量     

Go中的实现

官方文档中:

在创建aes或者是des接口时都是调用如下的方法、返回的block为一个接口

func NewCipher(key [] byte ) ( cipher . Block , error )

type Block interface {

    // 返回加密字节块的大小

    BlockSize() int

    // 加密src的第一块数据并写入dst,src和dst可指向同一内存地址

    Encrypt(dst, src []byte)

    // 解密src的第一块数据并写入dst,src和dst可指向同一内存地址

    Decrypt(dst, src []byte)

}

Block接口代表一个使用特定密钥的底层块加/解密器。它提供了加密和解密独立数据块的能力。

Block的Encrypt/Decrypt也能进行加密、但是只能加密第一组、因为aes的密钥长度为16、所以进行操作的第一组数据长度也是16

如果分组模式选择的是cbc

func NewCBCEncrypter(b Block, iv []byte) BlockMode    加密

func NewCBCDecrypter(b Block, iv []byte) BlockMode    解密

加密解密都调用同一个方法CryptBlocks()

并且cbc分组模式都会遇到明文最后一个分组的补充、所以会用到加密字节的大小

返回一个密码分组链接模式的、底层用b加密的BlockMode接口,初始向量iv的长度必须等于b的块尺寸。iv自己定义

返回的BlockMode同样也是一个接口类型

type BlockMode interface {

    // 返回加密字节块的大小

    BlockSize() int

    // 加密或解密连续的数据块,src的尺寸必须是块大小的整数倍,src和dst可指向同一内存地址

    CryptBlocks(dst, src []byte)

}

BlockMode接口代表一个工作在块模式(如CBC、ECB等)的加/解密器

返回的BlockMode其实是一个cbc的指针类型中的b和iv

# 加密流程: 

1. 创建一个底层使用des/3des/aes的密码接口 "crypto/des" func NewCipher(key []byte) (cipher.Block, error) # -- des func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des "crypto/aes" func NewCipher(key []byte) (cipher.Block, error) # == aes 

2. 如果使用的是cbc/ecb分组模式需要对明文分组进行填充

3. 创建一个密码分组模式的接口对象 - cbc func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密 - cfb func NewCFBEncrypter(block Block, iv []byte) Stream # 加密 - ofb - ctr

 4. 加密, 得到密文

流程:

填充明文:

先求出最后一组中的字节数、创建新切片、长度为新切片、值也为切片的长度、然后利用bytes.Reapet将长度换成字节切片、追加到原明文中

//明文补充

func padPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、求出需要填充的个数

    padNum := blockSize-len(plaintText) % blockSize

    //2、对填充的个数进行操作、与原明文进行合并

    newPadding := []byte{byte(padNum)}

    newPlain := bytes.Repeat(newPadding,padNum)

    plaintText = append(plaintText,newPlain...)

    return plaintText

}

去掉填充数据:

拿去切片中的最后一个字节、得到尾部填充的字节个数、截取返回

//解密后的明文曲调补充的地方

func createPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、得到最后一个字节、并将字节转换成数字、去掉明文中此数字大小的字节

    padNum := int(plaintText[len(plaintText)-1])

    newPadding := plaintText[:len(plaintText)-padNum]

    return newPadding

}

des加密:

1、创建一个底层使用des的密码接口、参数为秘钥、返回一个接口

2、对明文进行填充

3、创建一个cbc模式的接口、需要创建iv初始化向量、返回一个blockmode对象

4、加密、调用blockmode中的cryptBlock函数进行加密、参数为目标参数和源参数

//des利用分组模式cbc进行加密

func EncryptoText(plaintText []byte,key []byte)[]byte{

    //1、创建des对象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、对明文进行填充

    newText := padPlaintText(plaintText,cipherBlock.BlockSize())

    //3、选择分组模式、其中向量的长度必须与分组长度相同

    iv := make([]byte,cipherBlock.BlockSize())

    blockMode := cipher.NewCBCEncrypter(cipherBlock,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

des解密:

1、创建一个底层使用des的密码接口、参数为秘钥、返回一个接口

2、创建一个cbc模式的接口、需要创建iv初始化向量,返回一个blockmode对象

3、加密、调用blockmode中的cryptBlock函数进行解密、参数为目标参数和源参数

4、调用去掉填充数据的方法

//des利用分组模式cbc进行解密

func DecryptoText(cipherText []byte, key []byte)[]byte{

    //1、创建des对象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建cbc分组模式接口

    iv := []byte("12345678")

    blockMode := cipher.NewCBCDecrypter(cipherBlock,iv)

    //3、解密

    blockMode.CryptBlocks(cipherText,cipherText)

    //4、将解密后的数据进行去除填充的数据

    newText := clearPlaintText(cipherText,cipherBlock.BlockSize())

    return newText

}

Main函数调用

func main(){

    //需要进行加密的明文

    plaintText := []byte("CBC--密文没有规律、经常使用的加密方式,最后一个分组需要填充,需要初始化向量" +

        "(一个数组、数组的长度与明文分组相等、数据来源:负责加密的人提供,加解密使用的初始化向量必须相同)")

    //密钥Key的长度需要与分组长度相同、且加密解密的密钥相同

    key := []byte("1234abcd")

    //调用加密函数

    cipherText := EncryptoText(plaintText,key)

    newPlaintText := DecryptoText(cipherText,key)

    fmt.Println(string(newPlaintText))

}

AES加密解密相同、所以只需要调用一次方法就可以加密、调用两次则解密

推荐是用分组模式:cbc、ctr

aes利用分组模式cbc进行加密

//对明文进行补充

func paddingPlaintText(plaintText []byte , blockSize int ) []byte {

    //1、求出分组余数

    padNum := blockSize - len(plaintText) % blockSize

    //2、将余数转换为字节切片、然后利用bytes.Repeat得出有该余数的大小的字节切片

    padByte := bytes.Repeat([]byte{byte(padNum)},padNum)

    //3、将补充的字节切片添加到原明文中

    plaintText = append(plaintText,padByte...)

    return plaintText

}

//aes加密

func encryptionText(plaintText []byte, key []byte) []byte {

    //1、创建aes对象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、明文补充

    newText := paddingPlaintText(plaintText,block.BlockSize())

    //3、创建cbc对象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCEncrypter(block,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

//解密后的去尾

func clearplaintText(plaintText []byte, blockSize int) []byte {

    //1、得到最后一个字节、并转换成整型数据

    padNum := int(plaintText[len(plaintText)-1])

    //2、截取明文字节中去掉得到的整型数据之前的数据、此处出错、没有用len-padNum

    newText := plaintText[:len(plaintText)-padNum]

    return newText

}

//aes解密

func deCryptionText(crypherText []byte, key []byte ) []byte {

    //1、创建aes对象

    block, err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建cbc对象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCDecrypter(block,iv)

    //3、解密

    blockMode.CryptBlocks(crypherText,crypherText)

    //4、去尾

    newText := clearplaintText(crypherText,block.BlockSize())

    return newText

}

func main(){

    //需要进行加密的明文

    plaintText := []byte("CBC--密文没有规律、经常使用的加密方式,最后一个分组需要填充,需要初始化向量")

    //密钥Key的长度需要与分组长度相同、且加密解密的密钥相同

    key := []byte("12345678abcdefgh")

    //调用加密函数

    cipherText := encryptionText(plaintText,key)

    //调用解密函数

    newPlaintText := deCryptionText(cipherText,key)

    fmt.Println("解密后",string(newPlaintText))

}

//aes--ctr加密

func encryptionCtrText(plaintText []byte, key []byte) []byte {

    //1、创建aes对象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建ctr对象,虽然ctr模式不需要iv,但是go中使用ctr时还是需要iv

    iv := []byte("12345678abcdefgh")

    stream := cipher.NewCTR(block,iv)

    stream.XORKeyStream(plaintText,plaintText)

    return plaintText

}

func main() {

//aes--ctr加密解密、调用两次即为解密、因为加密解密函数相同stream.XORKeyStream

    ctrcipherText := encryptionCtrText(plaintText, key)

    ctrPlaintText := encryptionCtrText(ctrcipherText,key)

    fmt.Println("aes解密后", string(ctrPlaintText))

}

英文单词:

明文:plaintext     密文:ciphertext   填充:padding/fill    去掉clear  加密Encryption  解密Decryption

‘肆’ 当内容为英文字母时其在26字母中的其后三个字母代替该字母,若替代字母超过z,从a、b….字母轮回,其它字

#include<stdio.h>

#include<string.h>

#include<stdlib.h>


/*

*加密函数

*src-待加密的字符串

*outbuf-加密后的输出buffer,未对buffer作size的检查,调用处需分配足够空间

*返回-若加密成功返回加密后字符串的长度,失败返回-1

*/

intencode(constchar*src,char*outbuf,intbufsize)

{

inti=0;

while(*src)

{

if(i>=bufsize-1)//buffer最后需要额外一个byte空间存储字符串结束符''

{

printf("输出buffer溢出! ");

return-1;

}


if(*src>='a'&&*src<='z')//如果是小写字母做以下的转换

{

outbuf[i++]=(*src-'a'+1)%26+'a';

outbuf[i++]=(*src-'a'+2)%26+'a';

outbuf[i++]=(*src-'a'+3)%26+'a';

}

elseif(*src>='A'&&*src<='Z')//如果是大写字母做以下的转换

{

outbuf[i++]=(*src-'A'+1)%26+'A';

outbuf[i++]=(*src-'A'+2)%26+'A';

outbuf[i++]=(*src-'A'+3)%26+'A';

}

else//如果是其他字符原样输出

{

outbuf[i++]=*src;

}

src++;

}

//添加字符串结束符''

outbuf[i++]='';


//编码成功,返回编码后的字符串长度

returni;

}


intmain(constintargc,constchar*argv[])

{

chartest_str[100]={0};

char*outbuf=NULL;

intbuf_size=0;


printf("请输入待加密字符串(少于100个字符): ");

scanf("%s",&test_str);


buf_size=strlen(test_str)*sizeof(char)*3+1;//‘+1’是额外分配空间给'','*3'保证分配足够空

//申请足够的空间存储加密后的字符串

outbuf=(char*)malloc(buf_size);

if(outbuf==NULL)

{

printf("申请空间失败! ");

return-1;

}


printf("加密中...");

if(encode(test_str,outbuf,buf_size)<0)

{

printf("加密失败! ");

free(outbuf);

return-1;

}

else

{

printf("完成. ");

}

printf("加密后字串:%s ",outbuf);


//释放malloc申请的空间

free(outbuf);


return0;

}

‘伍’ 用JavaScript加密保护网站页面


我们经常会遇到一些必须庆绝输入用户名和密码才能进入的网站。其实我们也可以对自己的网站页面进行简单的加密改核,具体操作请看下文:
第一步:创建密码登录页
将如下代码加入HTML的BODY区:
[code]
script LANGUAGE="JavaScript"
!--
flag=0
flag2=0
--
/script
script LANGUAGE="JavaScript" SRC="password.txt" //密码表文件
/script
script LANGUAGE="JavaScript" SRC="password1.txt" //密码验证文件
/script
h1 align="center"Login/h1
script LANGUAGE="JavaScript"
!--
function main()
{
member = document.all.username.value
pass = document.all.password.value
encryption()
password()
}
--
/script
p输入用户名: input TYPE="TEXT" ID="username" size="20" br
请输入密码: input TYPE="PASSWORD" ID="password" size="20"
input TYPE="BUTTON" ID="button" onclick="main()" value="Enter!" align="center" /p[/code][button value="复制代码"]
第二步:分别编辑文件1(password.txt)和文件2(password1.txt)核差掘,适合你自己的页面情况,主要是密码设定和用户名设定。
文件1:password.txt
一张密码表,一看就懂,没有什么难度。可以自由设计,注意大小写的区别。
[code]function encryption()
{
mm = "Z"
k = "j"
b = "p"
mmmm = ""
ccc = "6"
l = "i"
c = "q"
m = "s"
abcd = "m"
o = "n"
u = "z"
e = "d"
gg = "U"
p = "u"
jj = "O"
v = "a"
j = "y"
x = "c"
r = "n"
bb = "D"
cc = "K"
z = "w"
a = "x"
ee = "G"
n = "f"
ff = "T"
i = "g"
w = "r"
ii = "V"
kk = "I"
q = "o"
oooo = ")"
d = "e"
nn = "E"
oo = "P"
pp = "X"
t = "h"
s = "v"
rr = "S"
ss = "L"
tt = "R"
uu = "A"
h = "k"
vv = "C"
ww = "M"
aa = "Y"
xx = "Q"
hh = "B"
yy = "H"
zz = "W"
y = "t"
qq = "J"
aaa = "8"
bbb = "0"
f = "b"
ddd = "9"
eee = " "
fff = "3"
dd = "N"
ggg = "4"
hhh = "1"
iii = "2"
jjj = "7"
kkk = "5"
lll = "."
mmm = ","
nnn = ";"
ooo = ":"
ppp = ""
qqq = ""
rrr = ""
sss = "-"
ttt = "_"
uuu = "="
vvv = "/"
www = "?"
xxx = "`"
yyy = "~"
zzz = "*"
aaaa = "+"
bbbb = "["
cccc = "]"
g = "l"
dddd = "{"
eeee = "}"
ffff = ""
gggg = "|"
hhhh = "!"
iiii = "@"
jjjj = "#"
kkkk = "code:quot;
llll = "%"
nnnn = "("
}[/code][button value="复制代码"]
文件2:password1.txt
[code]function password()
{
if(member==i+p+d+m+y) //第一个用户名;对照密码表翻译为:guest
{
if(pass==hhh+iii+fff+ggg) //第一个密码;对照密码表翻译为:1234
{
alert("还在外面傻站着干吗 " + member + "...") //输入正确后的提示语
window.location.href = x+q+e+d+lll+t+y+abcd //密码正确后进入的页面code.htm(对密码表)
flag2=1
}
}
if(member==k+v+j) //设定第二个用户名,以下类推...
{
if(pass==f+i+p+d)
{
alert("还在外面傻站着干吗 " + member + "...")
window.location.href = s+b+v+x+x+lll+t+y+abcd
flag2=1
}
}
if(member==qqq+llll+ttt+llll+rrr) //设定第三个用户名,以下类推...
{
if(pass==ooo+sss+oooo)
{
alert("还在外面傻站着干吗 " + member + "...")
window.location.href = s+b+v+x+x+lll+t+y+abcd
flag2=1
}
}
if(member=="")
{
}
else
{
if(flag==3) //设定允许连续输错密码的次数
{
window.location.href = "" //连续3次输错后导向该页面
flag2=1
}
if(flag2==1)
else
{
alert ("对不起,今天我心情不好,在外面待会儿吧!") //输错密码后的警示语
flag=flag+1
}
}
}[/code][button value="复制代码"]

‘陆’ Web前端中关于url、href、src的知识汇总

今天小编要跟大家分享的文章是Web前端中关于url、href、src的知识汇总。熟悉web前端的小伙伴们一定不会对这三个内容陌生。但是对于刚刚接触web的小伙伴肯定不是很了解,今天小编就败漏租为大家准备了这篇文章让我们一起来看一看关于url、href、src的知识汇总。

一、URL的概念


统一资源定位符(或称统一资源定位器/定位地址、URL地址等,英语:UniformResource
Locator,常缩写为URL),有时也被俗称为网页地址(网址)。如同在网络上的门牌,是因特网上标准的资源的地址(Address)。


二、URL的格式


2.1标准格式


协议类型:[//服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询


2.2完整格式


协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询


其中【访问凭证信息@;:端口号;?查询;#片段ID】都属于选填项。


三、URL的语法规则


比如网址#/html/index.asp,必须遵守以下的语法规则:


scheme://host.domain:port/path/filename


3.1说明


(1)scheme-定义因特网服务的类型。最常见的类型是http(2)host-定义域主机(http的默认主机是www)
(3)domain-定义因特网域名,比如w3school.com.cn(4):port-定义主机上的端口号(http的默认端口号是80)
(5)path-定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。(6)filename-定义文档/资源的名称


3.2URLSchemes


以下是其中一些最流行的scheme:


Scheme访问用于...


http超文本传输协议以http://开头的普通网页。不加密。


https安全超文本传输协议安全网页。加密所有信息交换。


ftp文件传输协议用于将文件下载或上传至网站。


file您计算机上的文件。


四、URL的类型


4.1绝对URL


绝对URL(absoluteURL)显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。


4.2相对URL


相对URL(relativeURL)以包含URL本身的文件夹的位置为参考点,描述目标文件夹的位置。


一般来说,对于同一服务器上的文件,应该总是使用相对URL,它们更容易输入,而且在将页面从本地系统转移到服务器上时更方便,只要每个文件的相对位置保持不变,链接就仍然是有效地。


以下为建立路径所使用的几个特殊符号,及其所代表的意义。


(1).:代表目前所在的目录,相对路径。如:文本或/>


(2)..:代表上一层目录,相对路径。如:
文本或/>


(3)../../:代表的是上一层目录的上一层目录,相对路径。如:


(4)/:代表根目录,绝对路径。如:[文本](/abc)或


五、href的概念


5.1规范解释


href(Hypertext
Reference)指定网络资源的位置,从而在当前元素或者当前文档和由当前属性定义的需要的锚点或资源之间定义一个链接或者关系。


5.2通俗理解


href目的不是为了引用资源,而是为了建立联系,让当前标签能够链接到目标地址。


六、src的概念


source(缩写),指向外部资源的位置,指向的内容将会应用到文档中当前标签所在位置。


七、href和src的区别


7.1请求资源类型不同


(1)href指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的联系。


(2)在请求src资源时会将其指向的资源下载并应用到文档中,比如JavaScript脚本,img图片;


7.2作用结果不同


(1)href用于在当前文档和引用察兆资源之间确立联系;


(2)src用于替换当前内容;


7.3浏览器解析方式不同


(1)若在文档中添加,浏览器会识别该文档为CSS文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式加载
CSS,而不是使用@import方式。


(2)当浏览器解析到
,会暂停其他资源的下载和处理,直到将该资源加载、
编译、执行完毕,图片和框架等也如此,类似于将所指向资源应用到当前内容。这也是为什么建议把js
脚本放在底部而不是头部的原因。


八、link和@import的区别


两者都是外部引用CSS的方式,但是存在一定的搜州区别:


(1)link是XHTML标签,除了能够加载CSS,还可以定义RSS等其他事务;而@import属于CSS范畴,只可以加载CSS。


(2)link引用CSS时,在页面载入时同时加载;@import需要页面完全载入以后再加载。


(3)link是XHTML标签,无兼容问题;@import则是在CSS2.1提出的,低版本的浏览器不支持。


(4)link支持使用Javascript控制DOM改变样式;而@import不支持。


以上就是小编今天为大家分享的关于Web前端中关于url、href、src的知识汇总的文章,希望本篇文章能够对正在从事web学习和工作的小伙伴们有所帮助,想要了解更多web相关知识记得关注北大青鸟web培训官网哦~


作者:WEBING


#/a/1190000013845173


*声明:内容与图片均来源于网络(部分内容有修改),版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

‘柒’ c语言字母加密

按照你的要求编写的字母加密的C语言程序如下

(姓字母向后移两位,名字母向后移三位)

#include<stdio.h>

#include<string.h>

int main(){

char src[30],result[]="",ch[2]={''};

int i,j,len;

fgets(src,30,stdin);

len=strlen(src);

for(i=0;src[i]!=' ';i++){

if('a'<=src[i] && src[i]<='z'){

ch[0]=(char)(((src[i]-'a')+2)%26+'a');

strcat(result,ch);

}else if('A'<=src[i] && src[i]<='Z'){

ch[0]=(char)(((src[i]-'A')+2)%26+'A');

strcat(result,ch);

}else{

ch[0]=src[i];

strcat(result,ch);

}

}

for(j=i;j<len;j++){

if('a'<=src[j] && src[j]<='z'){

ch[0]=(char)(((src[j]-'a')+3)%26+'a');

strcat(result,ch);

}else if('A'<=src[j] && src[j]<='Z'){

ch[0]=(char)(((src[j]-'A')+3)%26+'A');

strcat(result,ch);

}else{

ch[0]=src[j];

strcat(result,ch);

}

}

printf("%s ",result);

return 0;

}

‘捌’ PHP 加密扩展 php-beast 的使用

安装完 php-beast 后可以使用 tools 目录下的 encode_files.php 来加密你的项目。使用 encode_files.php 之前先修改 tools 目录下的 configure.ini 文件,如下:

src_path 是要加密项目的路径,
dst_path 是保存加密后项目的路径,
expire 是设置项目可使用的时间 (expire 的格式是:YYYY-mm-dd HH:ii:ss)。
encrypt_type是加密的方式,选择项有: DES、AES、BASE64 。
修改完 configure.ini 文件后就可以使用命令 php encode_files.php 开始加密项目。
附上例子:将demo项目全部加密到新的demo2

使用 beast_encode_file() 函数加密文件,函数原型如下:
beast_encode_file(string $input_file, string $output_file, int expire_timestamp, int encrypt_type)

例子:
beast_encode_file('index2.php','index3.php','1656518400',BEAST_ENCRYPT_TYPE_AES);

想要更深入了解的话可以看官方文档
https://github.com/liexusong/php-beast

参考文章:
https://www.jianshu.com/p/7bacac6effe5
https://blog.csdn.net/haileyuxin/article/details/123307604

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:432
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:743
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:146
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:235
java驼峰 发布:2025-02-02 09:13:26 浏览:651
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:538
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726