소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
FLUSHALL
명령을 사용하여 전체 데이터 집합을 삭제할 수 있습니다. 최근 인터넷에서 공개 실행 중인 보안되지 않은 Redis 인스턴스에 대한 악성 공격에 대한 보고가 있었습니다. 공격자는 데이터베이스를 지운 후 피해자에게 데이터베이스를 복원하려면 보상금을 지불하라고 요구했습니다. <behaviorExtensions/>
요소는 WCF가 특정 WCF 확장명에 사용자 지정 동작 클래스를 추가하도록 지시합니다.
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="myBehavior" type="MyBehavior" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
NSData *imageData = [NSData dataWithContentsOfFile:file];
CC_MD5(imageData, [imageData length], result);
let encodedText = text.cStringUsingEncoding(NSUTF8StringEncoding)
let textLength = CC_LONG(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
let digestLength = Int(CC_MD5_DIGEST_LENGTH)
let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLength)
CC_MD5(encodedText, textLength, result)
...
private static final String salt = "";
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,100000);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
...
...
const salt = "";
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
"",
0,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$hash = hash_pbkdf2('sha256', $password, '', 100000);
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', password, '', 100000)
...
...
dk = OpenSSL::PKCS5.pbkdf2_hmac(password, "", 100000, 256, digest)
...
...
let ITERATION = UInt32(100000)
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordLength,
"",
0,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
ITERATION,
derivedKey,
derivedKeyLength)
...
define('SECURE_AUTH_SALT', "");
...
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
hash = hashlib.md5("%s:%s" % ("", password,)).hexdigest()
store(username, hash)
...
require 'openssl'
...
password = get_password()
hash = OpenSSL::Digest::SHA256.digest(password)
...
...
PKCS5_PBKDF2_HMAC(pass, strlen(pass), "2!@$(5#@532@%#$253l5#@$", 2, ITERATION, EVP_sha512(), outputBytes, digest);
...
...
private static final String salt = "2!@$(5#@532@%#$253l5#@$";
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,100000);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
...
...
const salt = "some constant value";
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
"2!@$(5#@532@%#$253l5#@$",
2,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$hash = hash_pbkdf2('sha256', $password, '2!@$(5#@532@%#$253l5#@$', 100000)
...
...
from hashlib import pbkdf2_hmac
dk = pbkdf2_hmac('sha256', password, '2!@$(5#@532@%#$253l5#@$', 100000)
...
...
dk = OpenSSL::PKCS5.pbkdf2_hmac(password, '2!@$(5#@532@%#$253l5#@$', 100000, 256, digest)
...
...
let ITERATION = UInt32(100000)
let salt = "2!@$(5#@532@%#$253l5#@$"
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordLength,
salt,
salt.lengthOfBytesUsingEncoding(NSUTF8StringEncoding),
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
ITERATION,
derivedKey,
derivedKeyLength)
...
...
crypt(password, "2!@$(5#@532@%#$253l5#@$");
...
...
salt := "2!@$(5#@532@%#$253l5#@$"
password := get_password()
sha256.Sum256([]byte(salt + password)
...
...
Encryptor instance = ESAPI.encryptor();
String hash1 = instance.hash(input, "2!@$(5#@532@%#$253l5#@$");
...
javap -c
명령을 사용하여 사용된 솔트 값이 들어갈 디스어셈블된 코드에 접근할 수 있다는 것입니다.
...
crypt($password, '2!@$(5#@532@%#$253l5#@$');
...
...
from django.contrib.auth.hashers import make_password
make_password(password, salt="2!@$(5#@532@%#$253l5#@$")
...
require 'openssl'
...
password = get_password()
salt = '2!@$(5#@532@%#$253l5#@$'
hash = OpenSSL::Digest::SHA256.digest(salt + password)
...
...
Rfc2898DeriveBytes rdb8 = new Rfc2898DeriveBytes(password, salt,50);
...
...
#define ITERATION 50
...
PKCS5_PBKDF2_HMAC(pass, sizeof(pass), salt, sizeof(salt), ITERATION, EVP_sha512(), outputBytes, digest);
...
...
final int iterationCount=50;
PBEParameterSpec pbeps=new PBEParameterSpec(salt,iterationCount);
...
...
const iterations = 50;
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
...
#define ITERATION 50
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
salt,
saltLen
kCCPRFHmacAlgSHA256,
ITERATION,
derivedKey,
derivedKeyLen);
...
...
$hash = hash_pbkdf2('sha256', $password, $salt, 50);
...
...
from hashlib import pbkdf2_hmac
dk = pbkdf2_hmac('sha256', password, salt, 50)
...
bcrypt_hash = bcrypt(b64pwd, 11)
bcrypt
API를 사용할 때는 기본 해싱 프로세스의 계산 복잡도를 결정할 때 비용 매개 변수가 중요하다는 점을 기억해야 합니다. 충분한 보안 수준을 보장하려면 비용 매개 변수를 12 이상의 값으로 설정하는 것이 좋습니다. 이 값은 해시 계산에 소요되는 시간에 직접 영향을 주므로 높은 값을 설정하면 잠재적 공격자가 무차별 대입 또는 사전 공격을 수행하는 과정에서 발생하는 계산 비용이 증가합니다.
require 'openssl'
...
key = OpenSSL::PKCS5::pbkdf2_hmac(pass, salt, 50, 256, 'SHA256')
...
let ITERATION = UInt32(50)
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordLength,
saltBytes,
saltLength,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
ITERATION,
derivedKey,
derivedKeyLength)
...
...
<param name="keyObtentionIterations" value="50"/>
...
CL_ABAP_HMAC->UPDATE
메서드를 호출하는 단계를 건너뛰어 아무 데이터도 기반으로 하지 않는 해시가 생성됩니다.
...
DATA: obj TYPE REF TO cl_abap_hmac.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_key = 'ABCDEFG123456789'
RECEIVING
ro_object = obj.
obj->final( ).
....
CryptCreateHash
메서드를 호출하는 단계를 건너뛰어 아무 데이터도 기반으로 하지 않는 해시가 생성됩니다.
...
if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0)) {
break;
}
if(!CryptHashData(hHash, (BYTE*)hashData, strlen(hashData), 0)) {
break;
}
...
MessageDigest.update()
메서드를 호출하는 단계를 건너뛰어 아무 데이터도 기반으로 하지 않는 해시가 생성됩니다.
...
MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
io.writeLine(MyUtilClass.bytesToHex(messageDigest.digest()));
....
null
(nil
) 솔트는 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
솔트(nil
)를 사용하는 것은 좋은 방법이 아닙니다. null
솔트를 사용하면 해시된 값을 확인하기가 훨씬 쉬워지는 것은 물론, 문제 해결도 극도로 어려워집니다. 코드가 운영 단계에 들어간 후에는 솔트를 쉽게 변경할 수 없습니다. 공격자가 값이 null
솔트로 해시되었음을 알아차리는 경우 응용 프로그램에 대해 “레인보우 테이블”을 계산하고 해시된 값을 보다 쉽게 파악할 수 있습니다.null
(nil
) 솔트를 사용합니다.
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
nil,
0,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
솔트에도 접근할 수 있습니다. 프로그램을 공개한 후에는 null
솔트를 변경할 방법이 없습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다.null
(None
) 솔트는 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
솔트(None
)를 사용하는 것은 좋은 방법이 아닙니다. null
솔트를 사용하면 해시된 값을 확인하기가 훨씬 쉬워지는 것은 물론, 문제 해결도 극도로 어려워집니다. 코드가 운영 단계에 들어간 후에는 솔트를 쉽게 변경할 수 없습니다. 공격자가 값이 null
솔트로 해시되었음을 알아차리는 경우 응용 프로그램에 대해 “레인보우 테이블”을 계산하고 해시된 값을 보다 쉽게 파악할 수 있습니다.null
(None
) 솔트를 사용합니다.
import hashlib, binascii
from django.utils.crypto import pbkdf2
def register(request):
password = request.GET['password']
username = request.GET['username']
dk = pbkdf2(password, None, 100000)
hash = binascii.hexlify(dk)
store(username, hash)
...
null
솔트에도 접근할 수 있습니다. 프로그램을 공개한 후에는 null
솔트를 변경할 방법이 없습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다.null
(nil
) 솔트는 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
솔트(nil
)를 사용하는 것은 좋은 방법이 아닙니다. null
솔트를 사용하면 해시된 값을 확인하기가 훨씬 쉬워지는 것은 물론, 문제 해결도 극도로 어려워집니다. 코드가 운영 단계에 들어간 후에는 솔트를 쉽게 변경할 수 없습니다. 공격자가 값이 null
솔트로 해시되었음을 알아차리는 경우 응용 프로그램에 대해 “레인보우 테이블”을 계산하고 해시된 값을 보다 쉽게 파악할 수 있습니다.null
(nil
) 솔트를 사용합니다.
...
let ITERATION = UInt32(100000)
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordLength,
nil,
0,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
ITERATION,
derivedKey,
derivedKeyLength)
...
null
솔트에도 접근할 수 있습니다. 프로그램을 공개한 후에는 null
솔트를 변경할 방법이 없습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다.null
솔트(NULL
)는 본래의 목적과 모순되며, 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
솔트(NULL
)를 사용하는 것은 좋은 방법이 아닙니다. null
솔트는 의도한 목적과 모순될 뿐 아니라 프로젝트의 모든 개발자가 솔트를 볼 수 있습니다. 코드가 운영 단계에 들어간 후에는 솔트를 쉽게 변경할 수 없기 때문에 문제를 해결하기가 매우 어렵습니다. 공격자가 솔트 값을 아는 경우 응용 프로그램에 대한 "레인보우 테이블"을 계산하여 해시된 값을 쉽게 확인할 수 있습니다.null
솔트를 사용합니다.
...
define('SECURE_AUTH_SALT', NULL);
...
null
솔트를 변경할 방법이 없습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다.null
솔트(None
)는 솔트를 사용하는 본래의 목적을 무효화하며, 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
솔트(None
)를 사용하는 것은 좋은 방법이 아닙니다. null
솔트는 솔트를 사용하는 본래의 목적을 무효화하며, 모든 프로젝트 개발자가 솔트를 볼 수 있게 하고 문제 해결을 매우 어렵게 만듭니다. 코드가 운영 단계에 들어간 후에는 솔트를 쉽게 변경할 수 없습니다. 공격자가 솔트 값을 아는 경우 응용 프로그램에 대한 "레인보우 테이블"을 계산하여 해시된 값을 더 쉽게 확인할 수 있습니다.null
솔트(None
)를 사용합니다.
from django.utils.crypto import salted_hmac
...
hmac = salted_hmac(value, None).hexdigest()
...
null
솔트를 변경할 방법이 없습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다.
...
byte[] passwd = Encoding.UTF8.GetBytes(txtPassword.Text);
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(passwd, passwd,10001);
...
...
let password = getPassword();
let salt = password;
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
function register(){
$password = $_GET['password'];
$username = $_GET['username'];
$hash = hash_pbkdf2('sha256', $password, $password, 100000);
...
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
dk = hashlib.pbkdf2_hmac('sha256', password, password, 100000)
hash = binascii.hexlify(dk)
store(username, hash)
...
require 'openssl'
...
req = Rack::Response.new
password = req.params['password']
...
key = OpenSSL::PKCS5::pbkdf2_hmac(password, password, 100000, 256, 'SHA256')
...
...
string hashname = ConfigurationManager.AppSettings["hash"];
...
HashAlgorithm ha = HashAlgorithm.Create(hashname);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 hash
속성을 수정하여 해시 알고리즘을 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 특정 암호화 해시의 알고리즘 매개 변수를 알아내었는지 여부를 파악하기가 상당히 어렵기 때문에 사용자 제어 알고리즘과 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
Properties prop = new Properties();
prop.load(new FileInputStream("config.properties"));
String algorithm = prop.getProperty("hash");
...
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(hashInput.getBytes("UTF-8"));
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 hash
속성을 수정하여 해시 알고리즘을 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 특정 암호화 해시의 알고리즘 매개 변수를 알아내었는지 여부를 파악하기가 상당히 어렵기 때문에 사용자 제어 알고리즘과 관련된 문제를 되돌리기가 힘들 수 있습니다.
require 'openssl'
require 'csv'
...
CSV.read(my_file).each do |row|
...
hash = row[4]
...
digest = OpenSSL::Digest.new(hash, data)
...
end
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 CSV 파일에서 hash
를 수정하여 해시 알고리즘을 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 특정 암호화 해시의 알고리즘 매개 변수를 알아내었는지 여부를 파악하기가 상당히 어렵기 때문에 사용자 제어 알고리즘과 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
String minimumBits = prop.getProperty("minimumbits");
Hashing.goodFastHash(minimumBits).hashString("foo", StandardCharsets.UTF_8);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 minimumBits
속성을 수정하여 암호의 해시에 사용되는 최소 비트를 조작할 수 있습니다. 프로그램을 공개한 후에는 암호 해시의 최소 비트를 악의적인 사용자가 설정했는지 여부를 알 방법이 없기 때문에 사용자 제어 최소 비트에 관련한 문제를 되돌리기가 어려울 수 있습니다.
string salt = ConfigurationManager.AppSettings["salt"];
...
Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes("password", Encoding.ASCII.GetBytes(salt));
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
의 속성을 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
salt = getenv("SALT");
PKCS5_PBKDF2_HMAC(pass, sizeof(pass), salt, sizeof(salt), ITERATION, EVP_sha512(), outputBytes, digest);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 SALT
환경 변수를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
Properties prop = new Properties();
prop.load(new FileInputStream("local.properties"));
String salt = prop.getProperty("salt");
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,100000);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
의 속성을 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
app.get('/pbkdf2', function(req, res) {
...
let salt = req.params['salt'];
crypto.pbkdf2(
password,
salt,
iterations,
keyLength,
"sha256",
function (err, derivedKey) { ... }
);
}
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
의 속성을 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
@property (strong, nonatomic) IBOutlet UITextField *inputTextField;
...
NSString *salt = _inputTextField.text;
const char *salt_cstr = [salt cStringUsingEncoding:NSUTF8StringEncoding];
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
passwordLen,
salt_cstr,
salt.length,
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자는 누구든지 UITextField inputTextField
의 텍스트를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
function register(){
$password = $_GET['password'];
$username = $_GET['username'];
$salt = getenv('SALT');
$hash = hash_pbkdf2('sha256', $password, $salt, 100000);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 SALT
환경 변수를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
salt = os.environ['SALT']
dk = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
hash = binascii.hexlify(dk)
store(username, hash)
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 SALT
환경 변수를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
salt=io.read
key = OpenSSL::PKCS5::pbkdf2_hmac(pass, salt, iter_count, 256, 'SHA256')
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
의 텍스트를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
@IBOutlet weak var inputTextField : UITextField!
...
let salt = (inputTextField.text as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let saltPointer = UnsafePointer<UInt8>(salt.bytes)
let saltLength = size_t(salt.length)
...
let algorithm : CCPBKDFAlgorithm = CCPBKDFAlgorithm(kCCPBKDF2)
let prf : CCPseudoRandomAlgorithm = CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256)
CCKeyDerivationPBKDF(algorithm,
passwordPointer,
passwordLength,
saltPointer,
saltLength,
prf,
100000,
derivedKeyPointer,
derivedKeyLength)
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자는 누구든지 UITextField inputTextField
의 텍스트를 수정하여 키 또는 암호를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
salt = getenv("SALT");
password = crypt(getpass("Password:"), salt);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 SALT
환경 변수를 수정하여 암호의 해시에 사용되는 솔트를 조작할 수 있습니다. 또한 이 코드는 암호의 암호화 해싱에 사용하지 않아야 하는 crypt()
함수를 사용합니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
salt := r.FormValue("salt")
password := r.FormValue("password")
...
sha256.Sum256([]byte(salt + password))
}
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
환경 변수를 수정하여 암호의 해시에 사용되는 솔트를 조작할 수 있습니다. 또한 이 코드는 암호의 암호화 해싱에 사용하지 않아야 하는 Sum256
암호화 해시 함수를 사용합니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
Properties prop = new Properties();
prop.load(new FileInputStream("local.properties"));
String salt = prop.getProperty("salt");
...
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
return digest.digest(password.getBytes("UTF-8"));
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자는 누구든지 salt
속성을 수정하여 암호의 해시에 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 알 방법이 없기 때문에 사용자 제어 솔트에 관련한 문제를 되돌리기가 매우 어려울 수 있습니다.
import hashlib, binascii
def register(request):
password = request.GET['password']
username = request.GET['username']
salt = os.environ['SALT']
hash = hashlib.md5("%s:%s" % (salt, password,)).hexdigest()
store(username, hash)
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 SALT
환경 변수를 수정하여 암호의 해시에 사용되는 솔트를 조작할 수 있습니다. 또한 이 코드는 암호의 암호화 해싱에 사용하지 않아야 하는 md5()
암호화 해시 함수를 사용합니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
salt = req.params['salt']
hash = @userPassword.crypt(salt)
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 salt
매개 변수를 수정하여 암호의 해시에 사용되는 솔트를 조작할 수 있습니다. 또한 이 코드는 암호의 암호화 해싱에 사용하지 않아야 하는 String#crypt()
함수를 사용합니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
let saltData = userInput.data(using: .utf8)
sharedSecret.hkdfDerivedSymmetricKey(
using: SHA256.self,
salt: saltData,
sharedInfo: info,
outputByteCount: 1000
)
예제 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 userInput
의 값을 수정하여 암호화 키를 파생하는 데 사용되는 솔트를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 비밀번호 해시의 솔트를 알아내었는지 여부를 파악하기가 극도로 어렵기 때문에 사용자 제어 솔트와 관련된 문제를 되돌리기가 힘들 수 있습니다.
...
String seed = prop.getProperty("seed");
Hashing.murmur3_32_fixed(Integer.parseInt(seed)).hashString("foo", StandardCharsets.UTF_8);
...
Example 1
의 코드는 성공적으로 실행되지만 이 기능을 사용할 수 있는 사용자라면 누구나 seed
속성을 수정하여 암호의 해시에 사용되는 시드를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 시드를 알아내었는지 여부를 알 방법이 없기 때문에 사용자 제어 시드에 관련한 문제를 되돌리기가 어려울 수 있습니다.k
가 필요합니다. 이 값은 암호학적으로 임의적이어야 하고 비밀로 유지되어야 하며 절대 재사용되지 않아야 합니다. 공격자가 k
값을 추측할 수 있는 경우 또는 제공된 값을 대신 사용하도록 서명자를 속일 수 있는 경우 개인 키를 복구한 다음 서명을 위조하여 합법적인 서명자로 가장할 수 있습니다. 마찬가지로, 공격자는 k
값이 여러 메시지에 서명하는 데 재사용되는 경우 개인 키를 복구할 수 있습니다.k
가 필요합니다. 이 값은 암호학적으로 임의적이어야 하고 비밀로 유지되어야 하며 절대 재사용되지 않아야 합니다. 공격자가 k
값을 추측할 수 있는 경우 또는 제공된 값을 대신 사용하도록 서명자를 속일 수 있는 경우 개인 키를 복구한 다음 서명을 위조하여 합법적인 서명자로 가장할 수 있습니다. 마찬가지로, 공격자는 k
값이 여러 메시지에 서명하는 데 재사용되는 경우 개인 키를 복구할 수 있습니다.k
가 필요합니다. 이 값은 암호학적으로 임의적이어야 하고 비밀로 유지되어야 하며 절대 재사용되지 않아야 합니다. 공격자가 k
값을 추측할 수 있는 경우 또는 제공된 값을 대신 사용하도록 서명자를 속일 수 있는 경우 개인 키를 복구한 다음 서명을 위조하여 합법적인 서명자로 가장할 수 있습니다. 마찬가지로, 공격자는 k
값이 여러 메시지에 서명하는 데 재사용되는 경우 개인 키를 복구할 수 있습니다.k
가 필요합니다. 이 값은 암호학적으로 임의적이어야 하고 비밀로 유지되어야 하며 절대 재사용되지 않아야 합니다. 공격자가 k
값을 추측할 수 있는 경우 또는 제공된 값을 대신 사용하도록 서명자를 속일 수 있는 경우 개인 키를 복구한 다음 서명을 위조하여 합법적인 서명자로 가장할 수 있습니다. 마찬가지로, 공격자는 k
값이 여러 메시지에 서명하는 데 재사용되는 경우 개인 키를 복구할 수 있습니다.