소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
...
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)
...
...
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 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
속성을 수정하여 암호의 해시에 사용되는 시드를 조작할 수 있습니다. 프로그램을 공개한 후에는 악의적인 사용자가 암호 해시의 시드를 알아내었는지 여부를 알 방법이 없기 때문에 사용자 제어 시드에 관련한 문제를 되돌리기가 어려울 수 있습니다.