小程序请配置ai机器人密钥是SecretID和SecretKey。根据查询相关公开信息显示,首次使用必须在腾讯云官网注册生产访问密钥就是SecretID和SecretKey,并在AI控制台开通3项接口调用权限。
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。
对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
常用的有:DES、AES
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
常用的有:RSA
(1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
(2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由个人自己持有,并且必须妥善保管和注意保密。
公钥私钥的原则:
非对称密钥密码的主要应用就是公钥加密和公钥认证,而公钥加密的过程和公钥认证的过程是不一样的,下面我就详细讲解一下两者的区别。
比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
上面的过程可以用下图表示,Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。
身份认证和加密就不同了,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。
还是Alice和Bob这两个用户,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此Alice只要使用公钥密码学对文件签名发送 给Bob,Bob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。整个身 份认证的过程如下:
上面的过程可以用下图表示,Alice使用自己的私钥加密,Bob用Alice的公钥进行解密。
DES是Data Encryption Standard(数据加密标准)的缩写,DES算法为密码体制中的对称密码体制。它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,二十年来,它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。其中有极少量的数被认为是弱密匙,但是很容易避开他们。所以保密性依赖于密钥。
特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间。
DES现在已经不视为一种安全的加密算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解。也有一些分析报告提出了该算法的理论上的弱点,虽然实际情况未必出现。该标准在最近已经被 高级加密标准 (AES)所取代。
高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES ,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES的区块长度固定为128 位元 ,密钥长度则可以是128,192或256位元。
RSA加密算法是一种 非对称加密算法 。在 公钥加密标准 和 电子商业 中RSA被广泛使用。RSA是 1977年 由 罗纳德·李维斯特 (Ron Rivest)、 阿迪·萨莫尔 (Adi Shamir)和 伦纳德·阿德曼 (Leonard Adleman)一起提出的。当时他们三人都在 麻省理工学院 工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个 质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道 的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信 息的保密和安全。
开发中:
客户端发送的敏感数据时需要加密处理,客户端数据采用公钥加密,服务器用对应的秘钥解密,客户端保存公钥,服务器保存秘钥
服务器发送的数据也要加密时,服务器端数据采用秘钥加密,客户端数据用对应的公钥加密,客户端保存公钥,服务器保存秘钥
服务器要认证客户端时,客户端数据采用秘钥加密,服务器用对应的公钥解密,客户端保留秘钥,服务器保留公钥
常用加解密方案:
如果想要更加安全一点,可以在仿照微信的通信,每次都在传输数据上加上一个32为随机数和并将数据按照一定的规则生成一个校验sign
这里是例子,直接拿来用就可以了。
package comnnffdes;
import javasecuritySecurity;
import javaxcryptoCipher;
import javaxcryptoSecretKey;
import javaxcryptospecSecretKeySpec;
/字符串 DESede(3DES) 加密
ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的
加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加
密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的
密钥,P代表明文,C代表密表,这样,
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
/
public class ThreeDes {
/
@param args在java中调用sun公司提供的3DES加密解密算法时,需要使
用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:
jcejar
security/US_export_policyjar
security/local_policyjar
ext/sunjce_providerjar
/
private static final String Algorithm = "DESede"; //定义加密算法,可用 DES,DESede,Blowfish
//keybyte为加密密钥,长度为24字节
//src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = CiphergetInstance(Algorithm);
c1init(CipherENCRYPT_MODE, deskey);
return c1doFinal(src);//在单一方面的加密或解密
} catch (javasecurityNoSuchAlgorithmException e1) {
// TODO: handle exception
e1printStackTrace();
}catch(javaxcryptoNoSuchPaddingException e2){
e2printStackTrace();
}catch(javalangException e3){
e3printStackTrace();
}
return null;
}
//keybyte为加密密钥,长度为24字节
//src为加密后的缓冲区
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = CiphergetInstance(Algorithm);
c1init(CipherDECRYPT_MODE, deskey);
return c1doFinal(src);
} catch (javasecurityNoSuchAlgorithmException e1) {
// TODO: handle exception
e1printStackTrace();
}catch(javaxcryptoNoSuchPaddingException e2){
e2printStackTrace();
}catch(javalangException e3){
e3printStackTrace();
}
return null;
}
//转换成十六进制字符串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<blength; n++){
stmp = (javalangIntegertoHexString(b[n]& 0XFF));
if(stmplength()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<blength-1)hs=hs+":";
}
return hstoUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//添加新安全算法,如果用JCE就要把它添加进去
SecurityaddProvider(new comsuncryptoproviderSunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,
(byte)0xCB,
(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
(byte)0x98, 0x30, 0x40, 0x36,
(byte)0xE2
}; //24字节的密钥
String szSrc = "This is a 3DES test 测试";
Systemoutprintln("加密前的字符串:" + szSrc);
byte[] encoded = encryptMode(keyBytes,szSrcgetBytes());
Systemoutprintln("加密后的字符串:" + new String(encoded));
byte[] srcBytes = decryptMode(keyBytes,encoded);
Systemoutprintln("解密后的字符串:" + (new String(srcBytes)));
}
}
用来做一些模块的hash
>grep -Inr SECRET_KEY
conf/global_settingspy:255:SECRET_KEY = ''
conf/project_template/settingspy:61:SECRET_KEY = ''
contrib/auth/tokenspy:54: hash = sha_constructor(settingsSECRET_KEY + unicode(userid) +
contrib/comments/formspy:86: info = (content_type, object_pk, timestamp, settingsSECRET_KEY)
contrib/formtools/utilspy:15: order, pickles the result with the SECRET_KEY setting, then takes an md5
contrib/formtools/utilspy:32: dataappend(settingsSECRET_KEY)
contrib/messages/storage/cookiepy:112: SECRET_KEY, modified to make it unique for the present purpose
contrib/messages/storage/cookiepy:114: key = 'djangocontribmessages' + settingsSECRET_KEY
contrib/sessions/backends/basepy:89: pickled_md5 = md5_constructor(pickled + settingsSECRET_KEY)hexdigest()
contrib/sessions/backends/basepy:95: if md5_constructor(pickled + settingsSECRET_KEY)hexdigest() != tamper_check:
contrib/sessions/backends/basepy:134: # Use settingsSECRET_KEY as added salt
contrib/sessions/backends/basepy:143: settingsSECRET_KEY))hexdigest()
contrib/sessions/modelspy:16: pickled_md5 = md5_constructor(pickled + settingsSECRET_KEY)hexdigest()
contrib/sessions/modelspy:59: if md5_constructor(pickled + settingsSECRET_KEY)hexdigest() != tamper_check:
core/management/commands/startprojectpy:32: # Create a random SECRET_KEY hash, and put it in the main settings
core/management/commands/startprojectpy:37: settings_contents = resub(r"(<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
middleware/csrfpy:38: % (randrange(0, _MAX_CSRF_KEY), settingsSECRET_KEY))hexdigest()
middleware/csrfpy:41: return md5_constructor(settingsSECRET_KEY + session_id)hexdigest()
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如NET和android或者iOS的打交道。为了让数据交互更安全,我们需要对数据进行加密传输。今天研究了一下,把几种语言的加密都实践了一遍,实现了NET,java(android),iOS都同一套的加密算法,下面就分享给大家。
AES加密有多种算法模式,下面提供两套模式的可用源码。
加密方式:
先将文本AES加密
返回Base64转码
解密方式:
将数据进行Base64解码
进行AES解密
一、CBC(Cipher Block Chaining,加密块链)模式
是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度
密钥
密钥偏移量
java/adroid加密AESOperator类:
package combciwxbaseutil;
import javaxcryptoCipher;
import javaxcryptospecIvParameterSpec;
import javaxcryptospecSecretKeySpec;
import sunmiscBASE64Decoder;
import sunmiscBASE64Encoder;
/
AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化;
/
public class AESOperator {
/
加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
/
private String sKey = "smkldospdosldaaa";//key,可自行修改
private String ivParameter = "0392039203920300";//偏移量,可自行修改
private static AESOperator instance = null;
private AESOperator() {
}
public static AESOperator getInstance() {
if (instance == null)
instance = new AESOperator();
return instance;
}
public static String Encrypt(String encData ,String secretKey,String vector) throws Exception {
if(secretKey == null) {
return null;
}
if(secretKeylength() != 16) {
return null;
}
Cipher cipher = CiphergetInstance("AES/CBC/PKCS5Padding");
byte[] raw = secretKeygetBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(vectorgetBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipherinit(CipherENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipherdoFinal(encDatagetBytes("utf-8"));
return new BASE64Encoder()encode(encrypted);// 此处使用BASE64做转码。
}
// 加密
public String encrypt(String sSrc) throws Exception {
Cipher cipher = CiphergetInstance("AES/CBC/PKCS5Padding");
byte[] raw = sKeygetBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(ivParametergetBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipherinit(CipherENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipherdoFinal(sSrcgetBytes("utf-8"));
return new BASE64Encoder()encode(encrypted);// 此处使用BASE64做转码。
}
// 解密
public String decrypt(String sSrc) throws Exception {
try {
byte[] raw = sKeygetBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = CiphergetInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivParametergetBytes());
cipherinit(CipherDECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder()decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipherdoFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}
public String decrypt(String sSrc,String key,String ivs) throws Exception {
try {
byte[] raw = keygetBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = CiphergetInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivsgetBytes());
cipherinit(CipherDECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder()decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipherdoFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}
public static String encodeBytes(byte[] bytes) {
StringBuffer strBuf = new StringBuffer();
for (int i = 0; i < byteslength; i++) {
strBufappend((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
strBufappend((char) (((bytes[i]) & 0xF) + ((int) 'a')));
}
return strBuftoString();
}
欢迎分享,转载请注明来源:品搜搜测评网