密钥生成
量U系统使用了多种语言,为了在各语言之间保持加密解密的兼容性,密钥的生成需要遵循一定的规则
下面给出几种语言的生成方法,采取任意一种生成即可,之后便可以在 Android、iOS 和 PHP服务端三者中使用这个密钥进行加解密
Android Java
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import android.util.Base64;
public class EncryptUtils {
//AES算法相关
private static final String ALGORITHM = "AES";
/**
* 生成一个随机的AES密钥
*
* @return 生成的密钥
* @throws Exception 如果生成密钥失败
*/
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(256); // 可以选择128, 192, 256位密钥长度
return keyGenerator.generateKey();
}
/**
* 将密钥转换为Base64编码的字符串
*
* @param secretKey 密钥
* @return Base64编码的密钥字符串
*/
public static String secretKeyToBase64(SecretKey secretKey) {
return Base64.encodeToString(secretKey.getEncoded(), Base64.DEFAULT);
}
}
//调用方法生成密钥 base64key
SecretKey secretKey = EncryptUtils.generateKey();
String base64key = EncryptUtils.secretKeyToBase64(secretKey);
Log.i("base64key===>", base64key);标准 Java
package org.example;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
class EncryptUtils {
private static final String ALGORITHM = "AES";
/**
* 生成AES密钥
* @return 生成的AES密钥
* @throws Exception 如果密钥生成过程中发生错误
*/
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(256); // 可以选择128, 192, 256位密钥长度
return keyGenerator.generateKey();
}
/**
* 将密钥转换为Base64编码的字符串
* @param secretKey 密钥
* @return Base64编码的密钥字符串
*/
public static String secretKeyToBase64(SecretKey secretKey) {
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}
}
public class getAesKey {
public static void main(String[] args) throws Exception {
SecretKey secretKey = EncryptUtils.generateKey();
String base64key = EncryptUtils.secretKeyToBase64(secretKey);
System.out.println("base64key===>" + base64key);
}
}Object-C
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>
@interface AESKeyGenerator : NSObject
+ (NSData *)generateKeyWithSize:(size_t)size;
+ (NSString *)base64EncodedStringFromData:(NSData *)data;
@end
@implementation AESKeyGenerator
+ (NSData *)generateKeyWithSize:(size_t)size {
NSMutableData *keyData = [NSMutableData dataWithLength:size];
SecRandomCopyBytes(kSecRandomDefault, size, keyData.mutableBytes);
return keyData;
}
+ (NSString *)base64EncodedStringFromData:(NSData *)data {
return [data base64EncodedStringWithOptions:0];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 生成256位(32字节)的AES密钥
NSData *aesKey = [AESKeyGenerator generateKeyWithSize:32];
// 将密钥转换为Base64编码的字符串
NSString *base64Key = [AESKeyGenerator base64EncodedStringFromData:aesKey];
NSLog(@"base64key===>%@", base64Key);
}
return 0;
}PHP
<?php
class AESKeyGenerator
{
/**
* 生成AES密钥
* @param int $keySize 密钥长度(128, 192, 256位)
* @return string 生成的AES密钥(Base64编码)
*/
public static function generateKey($keySize = 256)
{
// 计算密钥长度(字节数)
$keyLength = $keySize / 8;
// 生成随机字节作为AES密钥
$key = openssl_random_pseudo_bytes($keyLength, $cryptoStrong);
if (!$cryptoStrong) {
throw new Exception("生成的密钥不够安全");
}
// 将密钥转换为Base64编码的字符串
return base64_encode($key);
}
}
try {
// 生成256位的AES密钥
$aesKeyBase64 = AESKeyGenerator::generateKey(256);
echo "base64key===>" . $aesKeyBase64 . PHP_EOL;
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . PHP_EOL;
}密钥填写的位置
Android客户端
//在上报数据前需要设置密钥,一般在 MainActivity 的 onCreate 方法中
RP.debug = true;
RP.base64SecretKey = "这里填写你的密钥";iOS客户端
//AppDelegate.m 的 didFinishLaunchingWithOptions 方法中配置
[[LionuDeviceInfoSDK shareInstance] initSDKWithHostUrl:@"https://这里填写你的域名" APPID:@"这里填写应用appid"];
[LionuDeviceInfoSDK shareInstance].configModel.isLog = NO;
[LionuDeviceInfoSDK shareInstance].configModel.base64AesKey = @"这里填写你的密钥";PHP服务端
//位于 项目目录/frontend/Common.php
defined('AES_BASE64_KEY') || define('AES_BASE64_KEY', 'aIlPkPRHwHpmuJj2qCkbCRw6N4+KRcHYpf2VwU33lvU='); //这里填写你的AES密钥