软件安全不是安全软件。此处我们关注的主题包括身份验证、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
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
中的代码可能会成功运行,但有权访问该代码的任何人都能知道它使用的是空 HMAC 密钥。一旦程序发布,除非修补该程序,否则可能无法更改此空 HMAC 密钥。心怀不轨的雇员可以利用手中掌握的信息访问权限破坏 HMAC 函数。另外,Example 1
中的代码还容易受到伪造和密钥恢复攻击的侵害。
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
中的代码可能会成功运行,但有权访问该代码的任何人都能确定它使用的是空 HMAC 密钥。一旦程序发布,除非修补该程序,否则无法更改此空 HMAC 密钥。心怀不轨的雇员可以利用手中掌握的信息访问权限破坏 HMAC 函数。另外,Example 1
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
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
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
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
中的代码还容易受到伪造和密钥恢复攻击的侵害。
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
中的代码可能会成功运行,但有权访问该代码的任何人都能知道它使用的是空 HMAC 密钥。一旦程序发布,除非修补该程序,否则可能无法更改此空 HMAC 密钥。心怀不轨的雇员可以利用手中掌握的信息访问权限破坏 HMAC 函数。另外,Example 1
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
中的代码可能会成功运行,但有权访问该代码的任何人都能知道它使用的是空 HMAC 密钥。一旦程序发布,除非修补该程序,否则可能无法更改此空 HMAC 密钥。心怀不轨的雇员可以利用手中掌握的信息访问权限破坏 HMAC 函数。另外,Example 1
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
中的代码可能会成功运行,但有权访问该代码的任何人都能知道它使用的是空 HMAC 密钥。一旦程序发布,除非修补该程序,否则可能无法更改此空 HMAC 密钥。心怀不轨的雇员可以利用手中掌握的信息访问权限破坏 HMAC 函数。另外,Example 1
中的代码还容易受到伪造和密钥恢复攻击的侵害。
...
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
包含一个已进行适当管理的强密码值,将其长度传递为 0 也会导致产生空、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
包含一个已进行适当管理的强密码值,将其长度传递为 0 也会导致产生空、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
准入控制器的 Kubernetes API 服务器。
...
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
(兆字节),这是不够的。
...
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