เนื่องจากใช้วิธีเข้ารหัส AES แบบมาตรฐานและ padding PKCS7 ดังนั้นคุณสามารถใช้ไลบรารีอื่นที่ให้บริการวิธีเดียวกันได้
Copy import base64
import hashlib
import json
import os
import time
from cryptography . hazmat . backends import default_backend
from cryptography . hazmat . primitives import padding
from cryptography . hazmat . primitives . ciphers import Cipher , algorithms , modes
# ค่านี้ถูกตั้งค่าเพื่อตัวอย่างเท่านั้น
CP_SECRET_KEY = '0123456789abcdefg'
def encrypt ( content : str , secret_key : str ) -> str :
key = hashlib . sha256 (secret_key. encode ( 'utf-8' )). digest () # แปลง CP_SECRET_KEY เป็น Key ขนาด 256-bit ด้วย SHA256
iv = os . urandom ( 16 ) # ใช้ IV ขนาด 16-byte (128-bit)
padder = padding . PKCS7 ( 128 ). padder () # ใช้ padding PKCS7 ขนาด 128-bit
backend = default_backend () # โดยทั่วไปใช้ OpenSSL เป็น backend
cipher = Cipher (algorithms. AES (key), modes. CBC (iv), backend = backend) # ใช้ AES โหมด CBC
encryptor = cipher . encryptor ()
content_padded = padder . update (content. encode ( 'utf-8' )) + padder . finalize ()
content_enc = encryptor . update (content_padded) + encryptor . finalize ()
return base64 . b64encode (iv + content_enc). decode ( 'utf-8' )
token_info = {
'uid' : 'test-user-1' ,
'fullname' : '김토끼' ,
'email' : 'tokki.kim@test.com' ,
'courseId' : 1234 ,
'ts' : int (time. time () * 1000 )
}
token = encrypt (json. dumps (token_info), CP_SECRET_KEY)
Copy using System ;
using System . Text ;
using System . Security . Cryptography ;
static String Encrypt ( String content , String secretKey)
{
using ( SHA256 sha256 = SHA256 . Create ())
using ( Aes aes = Aes . Create ())
{
byte [] iv = new byte [ 16 ];
rngCsp . GetBytes (iv);
aes . Key = sha256 . ComputeHash ( Encoding . UTF8 . GetBytes (secretKey));
aes . IV = iv;
aes . Mode = CipherMode . CBC ;
aes . Padding = PaddingMode . PKCS7 ;
byte [] contentBytes = Encoding . UTF8 . GetBytes (content);
byte [] contentEnc = aes . CreateEncryptor ()
. TransformFinalBlock (contentBytes , 0 , contentBytes . Length );
byte [] result = new byte [ iv . Length + contentEnc . Length ];
iv . CopyTo (result , 0 );
contentEnc . CopyTo (result , iv . Length );
return Convert . ToBase64String (result);
}
}
Copy import java . lang . System ;
import java . security . MessageDigest ;
import java . util . Base64 ; // เฉพาะ JDK 8 ขึ้นไป
import java . util . Random ;
import javax . crypto . Cipher ;
import javax . crypto . spec . IvParameterSpec ;
import javax . crypto . spec . SecretKeySpec ;
import javax . xml . bind . DatatypeConverter ; // เฉพาะ JDK 6, JDK 7
static String encrypt( String content , String secretKey) throws Exception {
byte [] iv = new byte [ 16 ];
new Random() . nextBytes (iv);
MessageDigest sha256 = MessageDigest . getInstance ( "SHA-256" );
sha256 . update ( secretKey . getBytes ( "UTF-8" ));
byte [] key = sha256 . digest ();
// PKCS5Padding ใน JAVA จริงตรงกับ PKCS7Padding
Cipher aes = Cipher . getInstance ( "AES/CBC/PKCS5Padding" );
aes . init ( Cipher . ENCRYPT_MODE , new SecretKeySpec(key , "AES" ) , new IvParameterSpec(iv) );
byte [] contentBytes = content . getBytes ( "UTF-8" );
byte [] contentEnc = aes . doFinal (contentBytes , 0 , contentBytes . length );
byte [] result = new byte [ iv . length + contentEnc . length ];
System . arraycopy (iv , 0 , result , 0 , iv . length );
System . arraycopy (contentEnc , 0 , result , iv . length , contentEnc . length );
// เฉพาะ JDK 8 ขึ้นไปเท่านั้น
byte [] resultBase64 = Base64 . getEncoder () . encode (result);
return new String(resultBase64) ;
// // เฉพาะ JDK 6, JDK 7
// return DatatypeConverter.printBase64Binary(result);
}
ตัวอย่างขั้นตอนการเข้ารหัสโทเค็น
Copy {
"uid" : "test-user-1" ,
"fullname" : "김토끼" ,
"email" : "tokki.kim@test.com" ,
"ts" : 1586961104518
}