軟體安全性並非安全性軟體。我們關注驗證、Access Control、保密性、加密以及權限管理之類的主題。
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = space
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
Example 1
中所示的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
中的程式碼或許可以順利執行,但有程式碼存取權的任何人都能判斷出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則絕無可能變更空的 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
private static String hmacKey = "";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
let hmacKey = "";
let hmac = crypto.createHmac("SHA256", hmacKey);
hmac.update(data);
...
範例 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。
...
CCHmac(kCCHmacAlgSHA256, "", 0, plaintext, plaintextLen, &output);
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
中的程式碼能夠順利執行,但有程式碼存取權的任何人都能看出它使用了空的 HMAC 金鑰。程式發佈後,除非修補此程式,否則可能無法變更空白 HMAC 金鑰。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。此外,Example 1
中的程式碼容易受到 forgery 和 key recovery 攻擊。
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("");
...
const pbkdfPassword = "";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"",
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
password
包含強式、經過適當管理的密碼值,傳遞零的長度也將導致空白、null
或其他意外的弱式密碼值。
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', '', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"",
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
password
包含強式、經過適當管理的密碼值,傳遞零的長度也將導致空白、null
或其他意外的弱式密碼值。
...
encryptionKey = "lakdsljkalkjlksdfkl".
...
...
var encryptionKey:String = "lakdsljkalkjlksdfkl";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
Blob encKey = Blob.valueOf('YELLOW_SUBMARINE');
Blob encrypted = Crypto.encrypt('AES128', encKey, iv, input);
...
...
using (SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("AES"))
{
string encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(encryptionKey);
algorithm.Key = keyBytes;
...
}
...
char encryptionKey[] = "lakdsljkalkjlksdfkl";
...
...
<cfset encryptionKey = "lakdsljkalkjlksdfkl" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("lakdsljkalkjlksd");
block, err := aes.NewCipher(key)
...
...
private static final String encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
...
var crypto = require('crypto');
var encryptionKey = "lakdsljkalkjlksdfkl";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
{
"username":"scott"
"password":"tiger"
}
...
...
NSString encryptionKey = "lakdsljkalkjlksdfkl";
...
...
$encryption_key = 'hardcoded_encryption_key';
//$filter = new Zend_Filter_Encrypt('hardcoded_encryption_key');
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
...
from Crypto.Ciphers import AES
encryption_key = b'_hardcoded__key_'
cipher = AES.new(encryption_key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
_hardcoded__key_
。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來洩漏由該系統加密的資料。
require 'openssl'
...
encryption_key = 'hardcoded_encryption_key'
...
cipher = OpenSSL::Cipher::AES.new(256, 'GCM')
cipher.encrypt
...
cipher.key=encryption_key
...
範例 2:以下程式碼會使用硬式編碼的加密金鑰執行 AES 加密:
...
let encryptionKey = "YELLOW_SUBMARINE"
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"YELLOW_SUBMARINE",
16,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQCtVacMo+w+TFOm0p8MlBWvwXtVRpF28V+o0RNPx5x/1TJTlKEl
...
DiJPJY2LNBQ7jS685mb6650JdvH8uQl6oeJ/aUmq63o2zOw=
-----END RSA PRIVATE KEY-----
...
...
Dim encryptionKey As String
Set encryptionKey = "lakdsljkalkjlksdfkl"
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
...
production:
secret_key_base: 0ab25e26286c4fb9f7335947994d83f19861354f19702b7bbb84e85310b287ba3cdc348f1f19c8cdc08a7c6c5ad2c20ad31ecda177d2c74aa2d48ec4a346c40e
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = 'secret_key'
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
import "crypto/hmac"
...
hmac.New(sha256.New, []byte("secret"))
...
...
private static String hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
const hmacKey = "a secret";
const hmac = createHmac('sha256', hmacKey);
hmac.update(data);
...
hmacKey
。若不懷好意的員工有此資訊的存取權,可能會使用此資訊來危害 HMAC 函數。
...
CCHmac(kCCHmacAlgSHA256, "secret", 6, plaintext, plaintextLen, &output);
...
import hmac
...
mac = hmac.new("secret", plaintext).hexdigest()
...
...
digest = OpenSSL::HMAC.digest('sha256', 'secret_key', data)
...
...
CCHmac(UInt32(kCCHmacAlgSHA256), "secret", 6, plaintext, plaintextLen, &output)
...
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("password", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("password");
...
const pbkdfPassword = "a secret";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"secret",
6,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "hardcodedpassword");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', 'password', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('password', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"secret",
6,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
Null
加密金鑰會導致無法輕易修正的安全性問題。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
var encryptionKey:ByteArray = null;
...
var aes.ICipher = Crypto.getCipher("aes-cbc", encryptionKey, padding);
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。Null
加密金鑰會導致無法輕易修正的安全性問題。null
加密金鑰絕對不是個好方法。使用 null
加密金鑰不僅會明顯降低良好的加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰:
...
char encryptionKey[] = null;
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這會顯著降低卓越加密演算法提供的保護,而且修正問題極為困難。產生違反規則的程式碼之後,變更 null
加密金鑰需要修補軟體。如果 null
加密金鑰保護的帳戶出現問題,系統擁有者必須在安全性和可用性之間做出選擇。null
加密金鑰執行 AES 加密:
...
aes.NewCipher(nil)
...
null
加密金鑰。此外,採用最基本破解技術的任何人都更有可能成功解密任何加密資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
SecretKeySpec key = null;
....
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
var crypto = require('crypto');
var encryptionKey = null;
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
nil,
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
指定給加密金鑰變數是不當的做法,因為會讓敏感與加密資訊暴露給攻擊者。使用 null
加密金鑰不僅會明顯降低良好的加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
。
...
$encryption_key = NULL;
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
null
加密金鑰,且採用甚至是基本破解技術的任何人都很有可能成功解密任何加密的資料。程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。None
指定給加密金鑰變數是不當的做法,因為會讓敏感與加密資訊暴露給攻擊者。使用 null
加密金鑰不僅會明顯降低良好的加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
。
...
from Crypto.Ciphers import AES
cipher = AES.new(None, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
null
加密金鑰,且採用甚至是基本破解技術的任何人都很有可能成功解密任何加密的資料。程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕對不是個好方法。使用 null
加密金鑰不僅會明顯降低良好的加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰,且採用甚至是基本破解技術的任何人都很有可能成功解密任何加密的資料。程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。Null
加密金鑰會導致無法輕易修正的安全性問題。null
加密金鑰絕對不是個好方法。使用 null
加密金鑰不僅會明顯降低良好的加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
nil,
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
加密金鑰絕不是明智的想法,因為這不僅會明顯降低卓越加密演算法提供的保護,還會使修正問題變得極為困難。產生違反規則的程式碼以後,除非修補軟體,否則無法變更 null
加密金鑰。如果 null
加密金鑰保護的帳戶出現問題,系統的所有者將必須在安全性和可行性之間做出選擇。null
加密金鑰執行 AES 加密:
...
Dim encryptionKey As String
Set encryptionKey = vbNullString
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
null
加密金鑰,甚至是任何具有基本破解技術的人都很有可能成功解密任何加密的資料。應用程式發佈後,除非修補軟體,否則無法變更 null
加密金鑰。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
加密金鑰的使用證據。null
密碼產生並使用加密金鑰時,可能會導致無法輕易修正系統安全性的問題。null
值做為密碼引數傳遞給以密碼為基礎的加密金鑰衍生函數絕對不是個好方法。在此情況下,產生的衍生金鑰將完全以提供的 Salt 為基礎 (使其明顯安全性較低),且會極難修正問題。違反規則的程式碼產生之後,除非修補軟體,否則通常無法變更 null
密碼。如果根據 null
密碼以衍生金鑰保護的帳戶出現問題,系統的所有者可能不得不在安全性和可用性之間選擇。null
值做為密碼引數傳遞到以密碼為基礎的加密金鑰衍生函數:
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword(null);
...
null
密碼引數產生一或多個加密金鑰,甚至任何人運用基本破解技術,也都極可能會成功取得權限以存取由違反規則的金鑰所保護的任何資源。如果攻擊者還能存取用於根據 null
密碼產生任何金鑰的 Salt 值,則破解那些金鑰就變得相當簡單了。程式發佈後,除非修補此程式,否則不能變更 null
密碼。若員工有此資訊的存取權,可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
密碼的使用證據。null
密碼產生並使用加密金鑰時,可能會導致無法輕易修正系統安全性的問題。null
值做為密碼引數傳遞給以密碼為基礎的加密金鑰衍生函數絕對不是個好方法。在此情況下,產生的衍生金鑰將完全以提供的 Salt 為基礎 (使其明顯安全性較低),且會極難修正問題。違反規則的程式碼產生之後,除非修補軟體,否則通常無法變更 null
密碼。如果根據 null
密碼以衍生金鑰保護的帳戶出現問題,系統的所有者可能不得不在安全性和可用性之間選擇。null
值做為密碼引數傳遞到以密碼為基礎的加密金鑰衍生函數:
...
CCKeyDerivationPBKDF(kCCPBKDF2,
nil,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
密碼引數產生一或多個加密金鑰,甚至任何人運用基本破解技術,也都極可能會成功取得權限以存取由違反規則的金鑰所保護的任何資源。如果攻擊者還能存取用於根據 null
密碼產生任何金鑰的 Salt 值,則破解那些金鑰就變得相當簡單了。程式發佈後,除非修補此程式,否則不能變更 null
密碼。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
密碼的使用證據。null
密碼產生並使用加密金鑰時,可能會導致無法輕易修正系統安全性的問題。null
值做為密碼引數傳遞給以密碼為基礎的加密金鑰衍生函數絕對不是個好方法。在此情況下,產生的衍生金鑰將完全以提供的 Salt 為基礎 (使其明顯安全性較低),且會極難修正問題。違反規則的程式碼產生之後,除非修補軟體,否則通常無法變更 null
密碼。如果根據 null
密碼以衍生金鑰保護的帳戶出現問題,系統的所有者可能不得不在安全性和可用性之間選擇。null
值做為密碼引數傳遞到以密碼為基礎的加密金鑰衍生函數:
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
nil,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
null
密碼引數產生一或多個加密金鑰,甚至任何人運用基本破解技術,也都極可能會成功取得權限以存取由違反規則的金鑰所保護的任何資源。如果攻擊者還能存取用於根據 null
密碼產生任何金鑰的 Salt 值,則破解那些金鑰就變得相當簡單了。程式發佈後,除非修補此程式,否則不能變更 null
密碼。若員工有此資訊的存取權,則可能會使用此資訊來進入並破壞系統。即使攻擊者僅有應用程式可執行檔的存取權,他們也可以擷取 null
密碼的使用證據。
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
f = open('mykey.pem','w')
f.write(key.exportKey(format='PEM'))
f.close()
require 'openssl'
key = OpenSSL::PKey::RSA.new 2048
File.open('mykey.pem', 'w') do |file|
file.write(key.to_pem)
end
--profiling
旗標,就是該旗標設定為 true
。iptables
進行必要變更。在 Kubelet 組態中,將 makeIPTablesUtilChains
設定為 enabled:false
可阻止 Kubelet 管理容器與環境其餘部分之間的網路流量。這會造成 Kubelet 無法強制執行必要的網路安全性需求,也無法設定容器所要求的連線。iptables
進行必要變更,這是因為設定了 makeIPTablesUtilChains: false
。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
makeIPTablesUtilChains: false
--profiling
旗標,就是該旗標設定為 true
。readOnlyRootFilesystem: false
設定會停用此限制,進而允許攻擊者竄改本機檔案系統或將惡意可執行檔寫入磁碟。readOnlyRootFilesystem
欄位設定為 false
,這會允許容器內的應用程式將資料寫入本機磁碟。
...
kind: Pod
...
spec:
containers:
- name: ...
...
securityContext:
readOnlyRootFilesystem: false
...
AlwaysPullImages
准入控制器可以防止這種規避。--enable-admission-plugins
旗標中沒有 AlwaysPullImages
准入控制器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodNodeSelector,LimitRanger
...
AlwaysAdmit
准入控制器。AlwaysAdmit
准入控制器來啟動一部 Kubernetes API 伺服器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=AlwaysAdmit,PodSecurityPolicy
...
--client-cert-auth
旗標設定為 false
。--client-cert-auth
旗標設定為 false
。
...
spec:
containers:
- command:
...
- etcd
...
--client-cert-auth=false
...
--kubelet-https
旗標設定為 false
,安全通訊將停用。--kubelet-https
旗標設定為 false
的情況下啟動的。
...
spec:
containers:
- command:
- kube-apiserver
- --kublet-https=false
- --authorization-mode=RBAC
image: example.domain/kube-apiserver-amd64:v1.6.0
...
--audit-log-maxage
旗標定義保留舊稽核記錄檔的最大天數。不是啟動 Kubernetes API 伺服器的指令中不存在該旗標,就是設定的保留期少於 30 天。--audit-log-maxage
旗標設定為 2
(即 2 天),這時間太短了。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --audit-log-maxage=2
...
--audit-log-maxbackup
旗標定義要保留的最大記錄檔數量。不是啟動 Kubernetes API 伺服器的指令中不存在此旗標,就是保留的最大記錄檔數量低於 10。--audit-log-maxbackup
旗標設定為 2
,這只會保留兩個記錄檔,顯然不夠。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --audit-log-maxbackup=2
...
--audit-log-maxsize
旗標會設定稽核記錄檔的最大大小 (以 MB 為單位),一旦超過此大小,系統即自動輪換記錄檔。不是啟動 Kubernetes API 伺服器的指令中不存在該旗標,就是設定的稽核記錄檔最大大小低於 100 MB。--audit-log-maxsize
旗標設定為 2
(MB),這不夠大。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- ----audit-log-maxsize=2
...
ProtectKernelDefaults
設定未設定或設定為 false,則 Kubelet 可以在執行階段期間修改核心參數。在部署 Kubernetes 之前,應該先最佳化並強化核心參數。若授予 Kubelet 變更核心參數的能力,將會擴大主機作業系統的受攻擊面。ProtectKernelDefaults: false
設定。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
ProtectKernelDefaults: false