我正在尝试使用 Azure Key Vault 中的密钥来加密和解密 Web API 的 cookie。
对于加密过程,我在该类中使用 RSA:
public class SimpleRSA
{
private RSA _rsa;
public SimpleRSA(RSA rsa)
{
_rsa = rsa;
}
public string EncryptAsync(string value)
{
var byteData = Encoding.Unicode.GetBytes(value);
var encryptedText = _rsa.Encrypt(byteData, RSAEncryptionPadding.OaepSHA1);
var encodedText = Convert.ToBase64String(encryptedText);
return encodedText;
}
public string DecryptAsync(string encryptedText)
{
var encryptedBytes = Convert.FromBase64String(encryptedText);
var decryptionResult = _rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA1);
var decryptedText = Encoding.Unicode.GetString(decryptionResult);
return decryptedText;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用该代码从密钥中获取 RSA:
public RSA GetRSA(string appId, string appSecret)
{
AuthenticationCallback callback …Run Code Online (Sandbox Code Playgroud) 通常我们通过 JWT(访问和刷新令牌)保护移动 API。但我们刚刚面临这样的情况:即使 JWT 令牌过期,我们的应用程序也必须 100% 可供用户使用。(这是一些紧急的事情)。用户/应用程序不能等待重新登录并获取新的 JWT 代码。
问题:长时间(...永远)保护 API 调用而不从后端获取新令牌的最佳方法是什么。当每个请求使用每个请求的当前日期时间附件对移动应用程序进行共享密钥加密时,我看到了几次变体...但我不确定这是一个好的解决方案,至少它会存在性能问题(加密的操作时间) /解密请求)。
我必须laravel 6用 JavaScript 解密加密的字符串。输入 laravel.env文件
APP_KEY=base64:Rva4FZFTACUe94+k+opcvMdTfr9X5OTfzK3KJHIoXyQ=
Run Code Online (Sandbox Code Playgroud)
并且在config/app.php文件密码中设置为以下...
APP_KEY=base64:Rva4FZFTACUe94+k+opcvMdTfr9X5OTfzK3KJHIoXyQ=
Run Code Online (Sandbox Code Playgroud)
到目前为止我所尝试过的如下......
Laravel 代码
'cipher' => 'AES-256-CBC',
Run Code Online (Sandbox Code Playgroud)
HTML 和 JavaScript 代码
$test = 'this is test';
$encrypted = Crypt::encrypt($test);
Run Code Online (Sandbox Code Playgroud)
上述代码的控制台输出如下屏幕截图所示...
我已经尝试了来自谷歌和堆栈溢出的许多其他 JS 代码,但没有运气。
更新
这是在单独的离线系统中解密字符串的要求。我不会在实时网站上使用 javascript 进行加密。相反,用java脚本解密将在离线系统上完成。
这些文档描述了技术差异,但没有描述实际差异。
我需要验证签名的数据。我不知道如何使用公钥。
public bool VerifyData(string data, string signature)
{
//decode signature from base 64
byte[] signatureByte = System.Convert.FromBase64String(signature);
//hash data to sha256
string hashedData = ConvertToSHA256(data);
byte[] hashedDataByte = System.Convert.FromBase64String(hashedData);
//verify with RSA PSS
string absPath = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/TP/public");
string publicKeyString = File.ReadAllText(absPath);
publicKeyString = RemoveRSAHeaderAndFooter(publicKeyString);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//This causes error
RSA.ImportCspBlob(System.Convert.FromBase64String(publicKeyString));
RSAParameters rsaParams = RSA.ExportParameters(true);
RSACng RSACng = new RSACng();
RSACng.ImportParameters(rsaParams);
return RSACng.VerifyData(hashedDataByte, signatureByte, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}
Run Code Online (Sandbox Code Playgroud)
导致RSA.ImportCspBlob错误。我的公钥是字符串类型。它看起来像这样:
-----BEGIN PUBLIC KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXX
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
我怎样才能验证它? …
仅使用类PBEKeySpec和,并知道和是否有办法解密以恢复?SecretFactorysaltcodedcodedpassword
public static byte[] encodePassword(char[] password, byte[] salt) {
PBEKeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH);
Arrays.fill(password, Character.MIN_VALUE);
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] coded = skf.generateSecret(spec).getEncoded();
return coded;
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
} finally {
spec.clearPassword();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,其中使用 AES CBC 128 算法加密 json 编码数组,然后在 javascript(React/Next Js 项目)中对其进行解密。我在php中的加密如下面的代码所示
加密 PHP
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
Run Code Online (Sandbox Code Playgroud)
我在用 Javascript 解密时遇到问题
到目前为止我的代码如下所示
const baseenc = CryptoJS.enc.Base64.parse(cipher).toString();
var encrypted = CryptoJS.AES.decrypt(cipher, key, { iv: iv }).toString();
var plaintext = CryptoJS.enc.Latin1.stringify(encrypted);
Run Code Online (Sandbox Code Playgroud)
任何人都可以显示错误是什么或帮助我获得正确的输出
我有一个用 Koltin 编写的包,我想用 Dart 重写它。我一直在尝试使用encrypt和pointycastle。但我遇到了问题
我将如何在 Dart 中编写这个实现。
我开始尝试对公钥进行编码
var modulusBytes = base64.decode(publicKey!);
import android.util.Base64
import java.security.KeyFactory
import java.security.NoSuchAlgorithmException
import java.security.PublicKey
import java.security.spec.InvalidKeySpecException
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
object Crypto {
private const val PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADfafwfegRHqfkBiKGn/rrgrgrgrrgg" +
"2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ=="
private const val ALGORITHM = "RSA"
private const val CIPHER = "RSA/ECB/PKCS1Padding"
private fun encrypt(text: String, key: PublicKey): ByteArray? {
var cipherText: ByteArray? = null
try {
// get an RSA cipher object
val cipher = Cipher.getInstance(CIPHER)
//init …Run Code Online (Sandbox Code Playgroud) 我想创建一个函数来加密字符串,它将字符串缩短为字母数字字符,并创建一个解密函数,它将取回加密的字符串。
\n这是我参考网上的代码编写的。
\nfunction compress(string) {\n string = unescape(encodeURIComponent(string));\n var newString = '',\n char, nextChar, combinedCharCode;\n for (var i = 0; i < string.length; i += 2) {\n char = string.charCodeAt(i);\n\n if ((i + 1) < string.length) {\n\n \n nextChar = string.charCodeAt(i + 1) - 31;\n\n \n combinedCharCode = char + "" + nextChar.toLocaleString('en', {\n minimumIntegerDigits: 2\n });\n\n newString += String.fromCharCode(parseInt(combinedCharCode, 10));\n\n } else {\n\n \n newString += string.charAt(i);\n }\n }\n return newString;\n}\n\nfunction decompress(string) {\n\n var newString = '',\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 java 中实现crypto-js的以下代码以进行加密
let toEncrypt= "my data";
cryptoJs.AES.encrypt(toEncrypt,"apasswordblabla").toString();
Run Code Online (Sandbox Code Playgroud)
这是我的实现(AES/CBC/PKCS7Padding):
public String encrypt(Map<String,Object> param){
try {
String toEncrypt= objectMapper.writeValueAsString(param);
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] saltData = Arrays.copyOfRange(stringToEncrypt.getBytes(StandardCharsets.UTF_8), 8, 16);
final byte[][] keyAndIV = generateKeyAndIV(32, 16, 1, saltData, "apasswordblabla".getBytes(StandardCharsets.UTF_8), md5);
SecretKeySpec skeySpec = new SecretKeySpec(keyAndIV[0], "AES");
IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);
Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding",BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec,iv);
byte[] base64Encoded = Base64.getEncoder().encode(cipher.doFinal(toEncrypt.getBytes(StandardCharsets.UTF_8)));
return new String(base64Encoded);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException
| BadPaddingException | InvalidKeyException
| JsonProcessingException | NoSuchProviderException …Run Code Online (Sandbox Code Playgroud)