mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-09-28 08:00:58 +00:00
84 lines
2.5 KiB
Go
84 lines
2.5 KiB
Go
import CryptoJS from 'crypto-js';
|
|
import JSEncrypt from 'jsencrypt';
|
|
|
|
export function getCookie(name: string) {
|
|
const value = `; ${document.cookie}`;
|
|
const parts = value.split(`; ${name}=`);
|
|
if (parts.length === 2) return parts.pop()?.split(';').shift();
|
|
}
|
|
|
|
function rsaEncrypt(data: string, publicKey: string) {
|
|
if (!data) {
|
|
return data;
|
|
}
|
|
const jsEncrypt = new JSEncrypt();
|
|
jsEncrypt.setPublicKey(publicKey);
|
|
return jsEncrypt.encrypt(data);
|
|
}
|
|
|
|
function aesEncrypt(data: string, key: string) {
|
|
const keyBytes = CryptoJS.enc.Utf8.parse(key);
|
|
const iv = CryptoJS.lib.WordArray.random(16);
|
|
const encrypted = CryptoJS.AES.encrypt(data, keyBytes, {
|
|
iv: iv,
|
|
mode: CryptoJS.mode.CBC,
|
|
padding: CryptoJS.pad.Pkcs7,
|
|
});
|
|
return iv.toString(CryptoJS.enc.Base64) + ':' + encrypted.toString();
|
|
}
|
|
|
|
function urlDecode(value: string): string {
|
|
return decodeURIComponent(value.replace(/\+/g, ' '));
|
|
}
|
|
|
|
function generateAESKey(): string {
|
|
const keyLength = 16;
|
|
const randomBytes = new Uint8Array(keyLength);
|
|
crypto.getRandomValues(randomBytes);
|
|
return Array.from(randomBytes)
|
|
.map((b) => b.toString(16).padStart(2, '0'))
|
|
.join('');
|
|
}
|
|
|
|
export const encryptPassword = (password: string) => {
|
|
if (!password) {
|
|
return '';
|
|
}
|
|
let rsaPublicKeyText = getCookie('panel_public_key');
|
|
if (!rsaPublicKeyText) {
|
|
return password;
|
|
}
|
|
rsaPublicKeyText = urlDecode(rsaPublicKeyText);
|
|
|
|
const aesKey = generateAESKey();
|
|
rsaPublicKeyText = rsaPublicKeyText.replaceAll('"', '');
|
|
const rsaPublicKey = atob(rsaPublicKeyText);
|
|
const keyCipher = rsaEncrypt(aesKey, rsaPublicKey);
|
|
const passwordCipher = aesEncrypt(password, aesKey);
|
|
return `${keyCipher}:${passwordCipher}`;
|
|
};
|
|
|
|
export function base64UrlToBuffer(base64url: string): ArrayBuffer {
|
|
let base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');
|
|
const pad = base64.length % 4;
|
|
if (pad) {
|
|
base64 += '='.repeat(4 - pad);
|
|
}
|
|
const binary = window.atob(base64);
|
|
const bytes = new Uint8Array(binary.length);
|
|
for (let i = 0; i < binary.length; i++) {
|
|
bytes[i] = binary.charCodeAt(i);
|
|
}
|
|
return bytes.buffer;
|
|
}
|
|
|
|
export function bufferToBase64Url(buffer: ArrayBuffer): string {
|
|
const bytes = new Uint8Array(buffer);
|
|
let binary = '';
|
|
bytes.forEach((byte) => {
|
|
binary += String.fromCharCode(byte);
|
|
});
|
|
const base64 = window.btoa(binary);
|
|
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
}
|